Skip to main content

Panduan Lengkap Lokalisasi Aplikasi iOS

Dari Localizable.strings hingga metadata App Store: lokalkan aplikasi iOS dengan Xcode, SwiftUI, Fastlane, dan penerjemahan AI otomatis.

1

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.

Xcode Project Settings
// 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.strings
Lokalisasi dasar memisahkan UI dari string-nya. Saat menambahkan bahasa, Xcode menawarkan pembuatan versi lokal storyboard, XIB, dan file string Anda.
2

Buat 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
// 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
Titik koma yang hilang menyebabkan kegagalan tanpa pesan—file dimuat tanpa kesalahan, tetapi terjemahan kosong. Pastikan juga file ditambahkan ke tahap build Copy Bundle Resources target Anda atau file tidak akan disertakan dalam bundle aplikasi.
Common .strings Mistakes
// ❌ 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";
3

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.

Localizable.xcstrings
// 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")
String Catalog menyimpan SEMUA bahasa dalam satu file JSON .xcstrings. Dalam tim, hal ini sering menyebabkan konflik merge Git saat beberapa orang menambahkan string. Untuk proyek besar, pertimbangkan satu catalog per modul.
4

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.

ContentView.swift
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"
            )
        }
    }
}
Text("Hello \(name)") gagal melakukan lokalisasi tanpa pesan saat name adalah variabel String biasa. Interpolasi string SwiftUI membuat LocalizedStringKey, tetapi hanya tipe tertentu (Int, Double, dan lainnya) yang diinterpolasi dengan benar. Untuk variabel String, gunakan String(localized:) untuk membuat string lokal terlebih dahulu.
5

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
<!-- 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)
Bahasa seperti Arab memiliki 6 bentuk jamak, Rusia 3, dan Jepang 1. Selalu tentukan semua kategori CLDR yang diperlukan bahasa target. String Catalog mempermudahnya dengan editor bentuk jamak visual.
6

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.

Terminal
# 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
Lokalisasi silang: App Store AS mengindeks kata kunci bahasa Inggris dan Spanyol. Melokalkan metadata ke bahasa Spanyol menjangkau pencarian pengguna Hispanik di AS tanpa menargetkan pasar terpisah.
7

Uji 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.

Testing Localization
// 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()
Uji dengan bahasa Jerman (string memanjang sekitar 30% dibandingkan Inggris) dan Jepang (string memendek sekitar 50%) untuk menemukan masalah tata letak sejak dini. Gunakan pseudolokalisasi Xcode untuk menguji tata letak secara ekstrem tanpa terjemahan asli.

Otomatiskan Kualitas Terjemahan

Temukan kunci hilang, placeholder rusak, dan masalah bentuk jamak sebelum dirilis dengan i18n-validate. Uji UI dengan terjemahan semu menggunakan i18n-pseudo sebelum terjemahan asli tersedia.
8

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.

Terminal
# 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
Tampilan App Store yang dilokalkan meningkatkan unduhan lebih dari 30% di pasar non-Inggris. Terjemahkan metadata bersama string aplikasi—ini adalah lokalisasi dengan ROI tertinggi yang dapat Anda lakukan.
+

Bonus: 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

Package Dependencies
// Swift Package Manager
// File > Add Package Dependencies >
// https://github.com/i18n-agent/ios-localechain.git
MyApp.swift
import 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

Titik koma yang hilang, tanda kutip yang tidak di-escape, atau pengodean yang salah menyebabkan kegagalan tanpa pesan. File dimuat, tetapi terjemahan tampak kosong. Selalu validasi file .strings sebelum commit.

Interpolasi Text SwiftUI Tidak Dilokalkan

Text("Hello \(stringVar)") tidak dilokalkan sesuai harapan. Gunakan String(localized:) untuk string terhitung atau pastikan variabel interpolasi memiliki tipe yang benar untuk LocalizedStringKey.StringInterpolation.

Widget/Ekstensi Menampilkan Kunci Mentah

Ekstensi aplikasi memiliki bundle terpisah. Pastikan file .strings atau .xcstrings ditambahkan ke tahap Copy Bundle Resources target ekstensi, bukan hanya target aplikasi utama.

Terjemahan yang Hilang Menampilkan Kunci di Produksi

Saat kunci tidak memiliki terjemahan untuk bahasa pengguna, iOS menampilkan kunci itu sendiri. Gunakan strategi bahasa fallback dan uji semua bahasa yang didukung sebelum rilis.

Struktur File yang Disarankan

Project Structure
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

Coba i18n Agent Sekarang

Lepaskan file terjemahan Anda di sini

JSON, YAML, PO, XML, CSV, Markdown, Properties

atau klik untuk menjelajahi

Bahasa target

Tidak perlu mendaftarEstimasi instan

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.

Terminal
// Swift Package Manager
// https://github.com/i18n-agent/ios-localechain
Configuration
import 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 →

FAQ Lokalisasi iOS