Skip to main content

iOS uygulama yerelleştirmesi için eksiksiz rehber

Localizable.strings'den App Store meta verilerine: iOS uygulamanızı Xcode, SwiftUI, Fastlane ve otomatik yapay zeka çevirisiyle yerelleştirin.

1

Xcode'da yerelleştirmeyi etkinleştirin

Xcode proje ayarlarınızı açın, Info > Localizations bölümüne gidin ve desteklemek istediğiniz dilleri ekleyin. Xcode, her dil için .lproj dizinlerini otomatik olarak oluşturur.

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
Temel yerelleştirme, kullanıcı arayüzünüzü dizelerinden ayırır. Bir dil eklediğinizde Xcode; storyboard'larınızın, XIB'lerinizin ve dize dosyalarınızın yerelleştirilmiş sürümlerini oluşturmayı önerir.
2

Localizable.strings oluşturun

Standart iOS yerelleştirme dosyası, eşittir işaretleriyle ayrılmış anahtar-değer çiftleri kullanır ve her satır noktalı virgülle biter. Kaynak dil için bu dosyayı Base.lproj klasörünüze yerleştirin.

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
Eksik noktalı virgüller sessiz hatalara neden olur; dosya hatasız yüklenir, ancak çeviriler boş kalır. Ayrıca dosyanın hedefinizin Copy Bundle Resources derleme aşamasına eklendiğinden emin olun; aksi takdirde uygulama paketine dahil edilmez.
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

String Catalogs'a geçin (Xcode 15+)

String Catalogs (.xcstrings), Apple'ın .strings dosyalarının yerine sunduğu modern çözümdür. Xcode'da görsel bir düzenleyici, SwiftUI görünümlerinizden otomatik dize çıkarma ve yerleşik çoğul desteği sunar.

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 Catalogs, TÜM dilleri tek bir .xcstrings JSON dosyasında saklar. Ekiplerde bu durum, birden çok kişi dize eklediğinde sık Git birleştirme çakışmalarına yol açar. Büyük projelerde modül başına bir katalog kullanmayı değerlendirin.
4

Yerelleştirilmiş dizeleri SwiftUI ve UIKit'te kullanın

SwiftUI'ın Text görünümü, dize sabitlerini otomatik olarak yerelleştirir. UIKit, NSLocalizedString kullanır. iOS 16+ için modern String(localized:comment:) API'si, yerleşik derleyici desteğiyle daha temiz bir söz dizimi sağlar.

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"
            )
        }
    }
}
name düz bir String değişkeniyse Text("Hello \(name)") sessizce yerelleştirilemez. SwiftUI'ın dizeye değer yerleştirme özelliği bir LocalizedStringKey oluşturur, ancak yalnızca belirli türlerin (Int, Double vb.) değerleri doğru şekilde yerleştirilir. String değişkenlerinde önce yerelleştirilmiş dizeyi oluşturmak için String(localized:) kullanın.
5

Çoğulları yönetin

iOS, çoğul kuralları için .stringsdict dosyalarını kullanır ve tüm CLDR çoğul kategorilerini destekler: zero, one, two, few, many, other. String Catalogs, çoğulları Xcode'daki görsel bir düzenleyiciyle yönetir; bu, stringsdict XML'ini elle yazmaktan çok daha kolaydır.

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)
Arapçada 6, Rusçada 3, Japoncada ise 1 çoğul biçimi vardır. Hedef dillerinizin ihtiyaç duyduğu tüm CLDR kategorilerini daima tanımlayın. String Catalogs, görsel çoğul düzenleyicisiyle bunu kolaylaştırır.
6

App Store meta verilerini Fastlane ile yerelleştirin

App Store meta verilerini (uygulama adı, alt başlık, açıklama, anahtar sözcükler ve sürüm notları) deponuzda yerel ayara göre düzenlenmiş düz metin dosyaları hâlinde sürüm denetimi altında tutmak için Fastlane'in deliver aracını kullanın.

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
Çapraz yerelleştirme: ABD App Store hem İngilizce hem İspanyolca anahtar sözcükleri dizine ekler. Meta verilerinizi İspanyolcaya yerelleştirerek ayrı bir pazarı hedeflemeden ABD'deki Hispanik kullanıcıların aramalarını yakalayabilirsiniz.
7

Yerelleştirmenizi test edin

Cihazınızın dilini değiştirmeden yerelleştirilmiş içeriği test edin. Uygulamayı herhangi bir dilde çalıştırmak için Xcode şema geçersiz kılmalarını, yerel ayar ortamına sahip SwiftUI önizlemelerini ve otomatik testler için başlatma argümanlarıyla XCUITest'i kullanın.

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()
Düzen sorunlarını erkenden yakalamak için Almanca (dizeler İngilizceye göre yaklaşık %30 uzar) ve Japoncayla (dizeler yaklaşık %50 kısalır) test yapın. Gerçek çeviriler olmadan düzenleri zorlamak için Xcode'un sahte yerelleştirme özelliğini kullanın.

Çeviri kalitesini otomatikleştirin

Eksik anahtarları, bozuk yer tutucuları ve çoğul sorunlarını kullanıma sunulmadan önce i18n-validate ile yakalayın. Gerçek çeviriler gelmeden önce kullanıcı arayüzünüzü i18n-pseudo kullanarak sahte çevirilerle test edin.
8

Çevirileri otomatikleştirin

.strings, .xcstrings ve Fastlane meta veri dosyalarınızı yapay zekayla çevirin. Tamamen yerelleştirilmiş bir varlık için hem uygulama içi dizelerin hem App Store meta verilerinin çevirisini otomatikleştirin.

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
Yerelleştirilmiş bir App Store varlığı, İngilizce konuşulmayan pazarlarda indirme sayısını %30'dan fazla artırır. Meta verilerinizi uygulama dizelerinizle birlikte çevirin; yapabileceğiniz en yüksek yatırım getirili yerelleştirme budur.
+

Ek: LocaleChain ile akıllı yerel ayar geri dönüşü

Varsayılan olarak iOS, kullanıcının tam yerel ayarı bulunmadığında geliştirme dilinize döner. Yalnızca pt-PT çevirileri bulunan pt-BR kullanıcısı, Portekizce yerine İngilizce görür. LocaleChain, yapılandırılabilir geri dönüş zincirleriyle bu sorunu çözer.

LocaleChain, açık kaynaklı bir Swift paketidir. GitHub'da görüntüleyin

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"]]
)

Yaygın sorunlar

.strings dosyası söz dizimi hataları

Eksik noktalı virgüller, kaçış karakteri eklenmemiş tırnak işaretleri veya yanlış kodlama sessiz hatalara neden olur. Dosya yüklenir, ancak çeviriler boş görünür. .strings dosyalarını göndermeden önce daima doğrulayın.

SwiftUI Text'te değer yerleştirmenin yerelleştirilmemesi

Text("Hello \(stringVar)") beklendiği gibi yerelleştirilmez. Hesaplanmış dizeler için String(localized:) kullanın veya yerleştirilen değişkenlerin LocalizedStringKey.StringInterpolation için doğru türde olduğundan emin olun.

Widget'larda/uzantılarda ham anahtarların görünmesi

Uygulama uzantılarının ayrı paketleri vardır. .strings veya .xcstrings dosyalarınızın yalnızca ana uygulama hedefine değil, uzantı hedefinin Copy Bundle Resources aşamasına da eklendiğinden emin olun.

Eksik çevirilerin üretimde anahtar olarak görünmesi

Bir anahtarın kullanıcının dilinde çevirisi yoksa iOS anahtarın kendisini gösterir. Bir geri dönüş dili stratejisi kullanın ve kullanıma sunmadan önce desteklenen tüm yerel ayarları test edin.

Önerilen dosya yapısı

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

i18n Agent'ı şimdi deneyin

Çeviri dosyanızı buraya bırakın

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

veya göz atmak için tıklayın

Hedef diller

Kayıt gerekmezAnında fiyat tahmini

ios-localechain ile yerel ayar geri dönüşü

de-AT gibi bölgesel bir yerel ayarda çeviri anahtarı eksik olduğunda iOS, önce üst yerel ayar de'yi denetlemek yerine doğrudan geliştirme diline geçer.

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"],
])

Desteklenen çerçevelerin tam listesi ve yerleşik 75 zincir için Yerel Ayar Geri Dönüşü Rehberimize bakın. Learn more →

iOS yerelleştirme hakkında sık sorulan sorular