
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.
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 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-rTWstrings.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 -->
<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><!-- ❌ 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>Çoğulları yönetin
Android, şu quantity özniteliklerine sahip '<plurals>' öğ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 -->
<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
) -->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.
// 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
))
}Dize dizileri ve biçimlendirilmiş dizeler
Sıralı listeler (ör. açılır liste seçenekleri, ilk kullanım adımları) için '<string-array>' 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 -->
<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>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.
# 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 supplyPlay 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şfedinYerelleş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.
// 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Çeviri kalitesini otomatikleştirin
Ç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.
# 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.2sAndroid Studio eklentisi kullanıma hazır
IntelliJ / Android Studio için i18n Agent eklentisiyle Android XML kaynaklarını doğrudan IDE'nizden çevirin.
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 (app module)
dependencies {
implementation("com.i18nagent:locale-chain-android:0.1.0")
}// 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ı
App Bundle dil bölümlerinin uygulama içi dil değiştirmeyi bozması
RTL düzenlerinin bozulması
Kitaplık kaynaklarının karışması
Önerilen dosya yapısı
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.ktsi18n 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
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.
implementation("com.i18nagent:locale-chain-android:0.1.0")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 →