
Android ऐप लोकलाइज़ेशन की संपूर्ण गाइड
strings.xml से लेकर Play Store मेटाडेटा तक: Kotlin, Jetpack Compose, Fastlane और ऑटोमेटेड AI अनुवाद से अपने Android ऐप को लोकलाइज़ करें।
लोकलाइज़ेशन के लिए अपना Android प्रोजेक्ट सेट अप करें
Android लोकलाइज़ेशन के लिए फ़ोल्डर-आधारित व्यवस्था का उपयोग करता है। आपकी डिफ़ॉल्ट स्ट्रिंग res/values/strings.xml में रहती हैं और अनूदित स्ट्रिंग res/values-de/, res/values-ja/ आदि जैसे लोकेल-विशिष्ट फ़ोल्डरों में रखी जाती हैं।
// 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 बनाएँ
Android स्ट्रिंग रिसोर्स में '<resources>' रूट के भीतर '<string>' एलिमेंट वाला XML उपयोग होता है। स्ट्रिंग प्लेसहोल्डर के लिए %s, पूर्णांकों के लिए %d और ऐसे पोज़िशनल आर्ग्युमेंट के लिए %1$s/%2$s उपयोग करें जिन्हें अनुवादक दोबारा क्रमबद्ध कर सकें।
<!-- 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>बहुवचन संभालें
Android quantity एट्रिब्यूट वाले '<plurals>' एलिमेंट उपयोग करता है: zero, one, two, few, many, other। हर लक्षित भाषा को अलग-अलग कैटेगरी की आवश्यकता हो सकती है—अरबी सभी 6 का उपयोग करती है, रूसी को few/many चाहिए और जापानी केवल other का उपयोग करती है।
<!-- 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
) -->कोड में उपयोग करें: Kotlin और Jetpack Compose
पारंपरिक Android में getString(R.string.key) और resources.getQuantityString() उपयोग होते हैं। Jetpack Compose में stringResource(R.string.key) और pluralStringResource() उपयोग होते हैं। रनटाइम पर दोनों डिवाइस लोकेल के आधार पर सही अनुवाद चुनते हैं।
// 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
))
}स्ट्रिंग ऐरे और फ़ॉर्मैट की गई स्ट्रिंग
क्रमबद्ध सूचियों के लिए '<string-array>' उपयोग करें, जैसे ड्रॉपडाउन विकल्प और ऑनबोर्डिंग चरण। फ़ॉर्मैट की गई स्ट्रिंग में पोज़िशनल फ़ॉर्मैट आर्ग्युमेंट (%1$s, %2$d) उपयोग करें, ताकि अनुवादक वाक्य की संरचना तोड़े बिना शब्दों का क्रम बदल सकें।
<!-- 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>Fastlane से Google Play मेटाडेटा लोकलाइज़ करें
Play Store मेटाडेटा—शीर्षक, संक्षिप्त विवरण, पूरा विवरण और बदलावों की सूची—प्रबंधित करने के लिए Fastlane के supply कमांड का उपयोग करें। इन्हें अपनी रिपॉज़िटरी में लोकेल के अनुसार व्यवस्थित प्लेन टेक्स्ट फ़ाइलों के रूप में रखें।
# 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 लिस्टिंग का लोकलाइज़ेशन ऑटोमेट करें
मैन्युअल कॉपी-पेस्ट छोड़ें। वर्ण-सीमा को ध्यान में रखते हुए अपने Play Store शीर्षक, विवरण और रिलीज़ नोट्स का 175+ लोकेल में अनुवाद करें।
Google Play इंटीग्रेशन देखेंअपने लोकलाइज़ेशन की जाँच करें
एमुलेटर में लोकेल बदलकर, कस्टम LocaleList वाले Compose प्रीव्यू और Developer Options के स्यूडोलोकेल से जाँच करें। तृतीय-पक्ष लाइब्रेरी से अनचाहे लोकेल रिसोर्स हटाने के लिए Gradle में resConfigs उपयोग करें।
// 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अनुवाद की गुणवत्ता जाँचने की प्रक्रिया ऑटोमेट करें
अनुवाद ऑटोमेट करें
AI से अपने strings.xml, plurals, स्ट्रिंग ऐरे और Fastlane Supply मेटाडेटा का अनुवाद करें। इन-ऐप स्ट्रिंग और Play Store मेटाडेटा—दोनों का अनुवाद ऑटोमेट करके अपने ऐप और Play Store लिस्टिंग को पूरी तरह लोकलाइज़ करें।
# 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 प्लगइन उपलब्ध है
IntelliJ / Android Studio के लिए i18n Agent प्लगइन से सीधे अपने IDE में Android XML रिसोर्स का अनुवाद करें।
अतिरिक्त सुविधा: LocaleChain के साथ स्मार्ट लोकेल फ़ॉलबैक
Android का रिसोर्स फ़ॉलबैक OS नियंत्रित करता है। pt-BR अनुवाद उपलब्ध न होने पर Android pt-PT को पूरी तरह छोड़कर अंग्रेज़ी दिखाता है। LocaleChain स्ट्रिंग लुकअप को इंटरसेप्ट करके कॉन्फ़िगर की जा सकने वाली फ़ॉलबैक चेन में खोज करता है, ताकि क्षेत्रीय यूज़र को उपलब्ध सबसे करीबी अनुवाद दिखाई दे।
Android के लिए LocaleChain एक ओपन-सोर्स Kotlin लाइब्रेरी है। GitHub पर देखें
// 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"))
)आम समस्याएँ
डिफ़ॉल्ट स्ट्रिंग न होने से ऐप क्रैश होता है
App Bundle के भाषा स्प्लिट इन-ऐप भाषा बदलने की सुविधा बिगाड़ते हैं
RTL लेआउट का बिगड़ना
लाइब्रेरी रिसोर्स का अनचाहा समावेश
सुझाई गई फ़ाइल संरचना
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 अभी आज़माएँ
अपनी अनुवाद फ़ाइल यहाँ छोड़ें
JSON, YAML, PO, XML, CSV, Markdown, Properties
या ब्राउज़ करने के लिए क्लिक करें
लक्षित भाषाएँ
locale-chain-android के साथ लोकेल फ़ॉलबैक
जब pt-BR जैसे क्षेत्रीय लोकेल में कोई अनुवाद कुंजी नहीं होती, तो Android पहले पैरेंट लोकेल pt की जाँच करने के बजाय सीधे डिफ़ॉल्ट रिसोर्स फ़ोल्डर पर चला जाता है।
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"),
)
)समर्थित फ़्रेमवर्क की पूरी सूची और पहले से उपलब्ध 75 चेन के लिए हमारी लोकेल फ़ॉलबैक गाइड देखें। Learn more →