Skip to main content

Android uygulama yerelleştirmesi için eksiksiz rehber

strings.xml'den Play Store meta verilerine: Android uygulamanızı Kotlin, Jetpack Compose, Fastlane ve otomatik yapay zeka çevirisiyle yerelleştirin.

1

Android projenizi yerelleştirme için hazırlayın

Android, yerelleştirme için klasör tabanlı bir düzen kullanır. Varsayılan dizeleriniz res/values/strings.xml içinde bulunur; çevrilmiş dizeler ise res/values-de/, res/values-ja/ vb. yerel ayara özel klasörlere yerleştirilir.

Android Project Structure
// Android project structure for localization:
// res/
// ├── values/              ← Default (fallback) locale
// │   └── strings.xml
// ├── values-de/           ← German
// │   └── strings.xml
// ├── values-ja/           ← Japanese
// │   └── strings.xml
// └── values-es/           ← Spanish
//     └── strings.xml
//
// Folder naming: values-{language} or values-{language}-r{Region}
// Examples: values-pt-rBR, values-zh-rCN, values-zh-rTW
res/values/ klasörü geri dönüş yerel ayarınızdır. Yerel ayara özel bir klasörde dize eksikse Android bunu varsayılan klasörden yükler. Ancak varsayılan klasörde bir dize eksikse uygulamanız desteklenmeyen yerel ayarlarda çöker.
2

strings.xml oluşturun

Android dize kaynakları, bir '<resources>' kökünün içinde '<string>' öğeleri bulunan XML kullanır. Dize yer tutucuları için %s, tam sayılar için %d ve çevirmenlerin sırasını değiştirebileceği konumsal argümanlar için %1$s/%2$s kullanın.

res/values/strings.xml
<!-- res/values/strings.xml -->
<resources>
    <string name="welcome_title">Welcome to MyApp</string>
    <string name="login_button">Sign In</string>
    <string name="settings_label">Settings</string>
    <string name="greeting">Hello, %s!</string>        <!-- %s = string -->
    <string name="item_count">%d items</string>          <!-- %d = integer -->
    <string name="app_name" translatable="false">MyApp</string>
</resources>
Kaçış karakteri eklenmemiş kesme işaretleri XML ayrıştırıcısını sessizce çökertir. \' kullanın veya değeri çift tırnak içine alın. Ayrıca varsayılan values/strings.xml dosyasında eksik bir dize, iOS'taki gibi sorunsuz geri dönüş yerine doğrudan çökmeye neden olur.
Common strings.xml Mistakes
<!-- ❌ Common mistakes in strings.xml: -->

<!-- Unescaped apostrophe — crashes XML parser silently -->
<string name="message">It's a great day</string>

<!-- Missing from default values/strings.xml — app crashes -->
<!-- (only exists in values-de/strings.xml) -->

<!-- ✅ Correct versions: -->
<string name="message">It\'s a great day</string>
<!-- Or wrap in double quotes: -->
<string name="message">"It's a great day"</string>
3

Çoğulları yönetin

Android, şu quantity özniteliklerine sahip '&lt;plurals&gt;' öğelerini kullanır: zero, one, two, few, many, other. Her hedef dil farklı kategorilere ihtiyaç duyabilir; Arapça 6 kategorinin tamamını, Rusça few/many kategorilerini, Japonca ise yalnızca other kategorisini kullanır.

res/values/strings.xml
<!-- res/values/strings.xml -->
<resources>
    <plurals name="items_count">
        <item quantity="zero">No items</item>
        <item quantity="one">%d item</item>
        <item quantity="other">%d items</item>
    </plurals>
</resources>

<!-- Usage in Kotlin: -->
<!-- val text = resources.getQuantityString(
    R.plurals.items_count,
    count,    // selects plural form
    count     // format argument
) -->
quantity özniteliği, cihazın yerel ayarına ait CLDR kurallarına göre çoğul biçimini seçer. Geri dönüş olarak daima 'other' değerini ekleyin; her dilde bulunması garanti edilen tek kategori budur.
4

Kodda kullanın: Kotlin ve Jetpack Compose

Geleneksel Android, getString(R.string.key) ve resources.getQuantityString() kullanır. Jetpack Compose ise stringResource(R.string.key) ve pluralStringResource() kullanır. Her ikisi de çalışma zamanında cihazın yerel ayarına göre doğru çevirimi çözümler.

WelcomeScreen.kt
// Traditional Android (Activity/Fragment)
val title = getString(R.string.welcome_title)
val greeting = getString(R.string.greeting, userName)
val items = resources.getQuantityString(
    R.plurals.items_count, count, count
)

// Jetpack Compose
@Composable
fun WelcomeScreen(userName: String, itemCount: Int) {
    // ✅ stringResource — Compose-aware, triggers recomposition
    Text(text = stringResource(R.string.welcome_title))

    // ✅ With format arguments
    Text(text = stringResource(R.string.greeting, userName))

    // ✅ Plurals — count passed TWICE
    Text(text = pluralStringResource(
        R.plurals.items_count,
        itemCount,    // selects plural form
        itemCount     // format argument
    ))
}
pluralStringResource(R.plurals.items, count, count) — count parametresi iki kez aktarılır. İlki çoğul biçimini seçer, ikincisi biçim argümanıdır. İkinci count değerinin eksikliği, Compose'daki en yaygın çoğullaştırma hatasıdır.
5

Dize dizileri ve biçimlendirilmiş dizeler

Sıralı listeler (ör. açılır liste seçenekleri, ilk kullanım adımları) için '&lt;string-array&gt;' kullanın. Çevirmenlerin cümle yapısını bozmadan sözcüklerin sırasını değiştirebilmesi için biçimlendirilmiş dizelerde konumsal biçim argümanları (%1$s, %2$d) kullanın.

res/values/strings.xml
<!-- res/values/strings.xml -->
<resources>
    <!-- String array for dropdown/list -->
    <string-array name="sort_options">
        <item>Most Recent</item>
        <item>Most Popular</item>
        <item>Price: Low to High</item>
        <item>Price: High to Low</item>
    </string-array>

    <!-- Positional format args for reordering -->
    <string name="welcome_message">
        Hello %1$s, you have %2$d new messages
    </string>
    <!-- Translators can reorder: -->
    <!-- %2$d neue Nachrichten für %1$s -->
</resources>
%1$s gibi konumsal argümanlar, çevirmenlerin parametreleri serbestçe yeniden sıralamasına olanak tanır. 'Hello %1$s, you have %2$d items' ifadesi, farklı sözcük sırasına sahip dillerde kod değişikliği yapılmadan '%1$s için %2$d öğe var' biçimine dönüşebilir.
6

Google Play meta verilerini Fastlane ile yerelleştirin

Play Store meta verilerini (başlık, kısa açıklama, tam açıklama ve değişiklik günlükleri) deponuzda yerel ayara göre düzenlenmiş düz metin dosyaları olarak yönetmek için Fastlane'in supply komutunu kullanın.

Terminal
# Install Fastlane
$ gem install fastlane

# Initialize supply for Play Store metadata
$ fastlane supply init

# Directory structure created:
# fastlane/metadata/android/
# ├── en-US/
# │   ├── title.txt              # App name (50 chars)
# │   ├── short_description.txt  # Short desc (80 chars)
# │   ├── full_description.txt   # Full desc (4000 chars)
# │   └── changelogs/
# │       └── default.txt        # What's New
# ├── de-DE/
# │   └── ...
# └── ja-JP/
#     └── ...

# Push metadata to Play Store:
$ fastlane supply
Play Store girişinizi yerelleştirmek, İngilizce konuşulmayan pazarlarda indirme sayısını %30'dan fazla artırır. Başlık, kısa açıklama ve tam açıklama aramalar için dizine eklenir; bunları çevirmek yapabileceğiniz en yüksek yatırım getirili yerelleştirmedir.
Google Play

Play Store girişinizin yerelleştirmesini otomatikleştirin

Elle kopyalayıp yapıştırmayı bırakın. Play Store başlığınızı, açıklamanızı ve sürüm notlarınızı karakter sınırlarını gözeterek 175+ yerel ayara çevirin.

Google Play bütünleştirmesini keşfedin
7

Yerelleştirmenizi test edin

Emülatörde yerel ayar değiştirme, özel LocaleList içeren Compose önizlemeleri ve Geliştirici Seçenekleri'ndeki sahte yerel ayarlarla test yapın. Üçüncü taraf kitaplıklardaki istenmeyen yerel ayar kaynaklarını kaldırmak için Gradle'da resConfigs kullanın.

Testing Localization
// 1. Emulator: Settings > System > Language > Add language

// 2. Compose Preview with locale:
@Preview
@Composable
fun WelcomePreview() {
    val config = Configuration(resources.configuration).apply {
        setLocale(Locale("de"))
    }
    val localContext = LocalContext.current
    val localizedContext = localContext.createConfigurationContext(config)
    CompositionLocalProvider(
        LocalContext provides localizedContext
    ) {
        WelcomeScreen()
    }
}

// 3. Restrict library locales in build.gradle.kts:
android {
    defaultConfig {
        // Only include locales you actually translate
        resourceConfigurations += listOf("en", "de", "ja", "es", "fr")
    }
}

// 4. Enable pseudolocales in Developer Options:
// en-XA (accented) — detects hardcoded strings
// ar-XB (RTL) — tests layout mirroring
Düzen sorunlarını yakalamak için Almanca (metin yaklaşık %30 uzar) ve Japoncayla (yaklaşık %50 kısalır) test yapın. Gerçek çeviriler olmadan düzenleri zorlamak için Geliştirici Seçenekleri'nde sahte yerel ayarları (aksanlı metin için en-XA, RTL için ar-XB) etkinleştirin.

Ç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.xml, çoğul, dize dizisi ve Fastlane Supply meta veri dosyalarınızı yapay zekayla çevirin. Tamamen yerelleştirilmiş bir varlık için hem uygulama içi dizelerin hem Play Store meta verilerinin çevirisini otomatikleştirin.

Terminal
# Translate strings.xml files
> Translate res/values/strings.xml
  to Japanese, German, and Spanish

# Translate Play Store metadata too
> Translate fastlane/metadata/android/en-US/
  to de-DE, ja-JP, es-ES

✓ 6 files translated in 3.2s
i18n Agent, Android XML kaçış karakterlerini yönetir, translatable="false" işaretlerini korur, hedef dil başına CLDR çoğul kategorilerine uyar ve konumsal biçim argümanlarını değiştirmez.
JetBrains

Android Studio eklentisi kullanıma hazır

IntelliJ / Android Studio için i18n Agent eklentisiyle Android XML kaynaklarını doğrudan IDE'nizden çevirin.

Install
+

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

Android'in kaynak geri dönüşü işletim sistemi tarafından denetlenir. pt-BR çevirileri eksik olduğunda Android, pt-PT'yi tamamen atlayarak İngilizceyi gösterir. LocaleChain, dize aramalarına müdahale edip yapılandırılabilir bir geri dönüş zincirinde ilerler; böylece bölgesel kullanıcılar mevcut en yakın çeviriyi görür.

Android için LocaleChain, açık kaynaklı bir Kotlin kitaplığıdır. GitHub'da görüntüleyin

build.gradle.kts
// build.gradle.kts (app module)
dependencies {
    implementation("com.i18nagent:locale-chain-android:0.1.0")
}
MyApp.kt / BaseActivity.kt
// 1. Application.onCreate() — configure chains once
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        LocaleChain.configure()
    }
}

// 2. BaseActivity — wrap context per Activity
open class BaseActivity : AppCompatActivity() {
    override fun attachBaseContext(newBase: Context) {
        super.attachBaseContext(LocaleChain.wrap(newBase))
    }
}

// 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 = mapOf("es-MX" to listOf("es-419", "es"))
)

Yaygın sorunlar

Eksik varsayılan dizelerin çökmeye neden olması

Ham anahtarı gösteren iOS'tan farklı olarak Android, varsayılan res/values/strings.xml dosyasında bir dize eksikse ResourceNotFoundException nedeniyle çöker. Her anahtarın varsayılan dosyada bulunduğundan daima emin olun.

App Bundle dil bölümlerinin uygulama içi dil değiştirmeyi bozması

Google Play App Bundles, APK'leri dile göre böler; kullanıcılar yalnızca cihaz dillerine ait dizeleri alır. Uygulama içi dil değiştirme sunuyorsanız build.gradle.kts dosyanıza bundle '{ language { enableSplit = false } }' ekleyin.

RTL düzenlerinin bozulması

Düzenlerde start/end yerine left/right kullanılması veya AndroidManifest.xml dosyasında android:supportsRtl="true" değerinin eksik olması buna yol açar. Mevcut düzenleri otomatik olarak dönüştürmek için Android Studio'nun Refactor > Add RTL Support seçeneğini kullanın.

Kitaplık kaynaklarının karışması

Üçüncü taraf kitaplıklar kendi values-XX/strings.xml dosyalarını paketleyerek Android'in uygulamanızın aslında desteklemediği dilleri desteklediğini sanmasına neden olur. Dahil edilen yerel ayarları yalnızca gerçekten çevirdiğiniz dillerle sınırlamak için build.gradle.kts içinde resConfigs kullanın.

Önerilen dosya yapısı

Project Structure
MyApp/
├── app/
│   └── src/main/
│       ├── res/
│       │   ├── values/
│       │   │   ├── strings.xml          # Default (source) strings
│       │   │   └── plurals.xml          # Plural rules
│       │   ├── values-de/
│       │   │   └── strings.xml
│       │   ├── values-ja/
│       │   │   └── strings.xml
│       │   └── values-es/
│       │       └── strings.xml
│       ├── java/com/example/myapp/
│       └── AndroidManifest.xml
├── fastlane/
│   └── metadata/android/
│       ├── en-US/
│       │   ├── title.txt
│       │   ├── short_description.txt
│       │   ├── full_description.txt
│       │   └── changelogs/default.txt
│       ├── de-DE/
│       └── ja-JP/
├── build.gradle.kts
└── settings.gradle.kts

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

locale-chain-android ile yerel ayar geri dönüşü

pt-BR gibi bölgesel bir yerel ayarda çeviri anahtarı eksik olduğunda Android, önce üst yerel ayar pt'yi denetlemek yerine doğrudan varsayılan kaynak klasörüne geçer.

Terminal
implementation("com.i18nagent:locale-chain-android:0.1.0")
Configuration
import com.i18nagent.localechain.LocaleChain

LocaleChain.configure(
    overrides = mapOf(
        "pt-BR" to listOf("pt", "en"),
        "zh-Hant-HK" to listOf("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 →

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