
Pilnīgs Android lietotņu lokalizācijas ceļvedis
No strings.xml līdz Play Store metadatiem: lokalizējiet Android lietotni ar Kotlin, Jetpack Compose, Fastlane un automatizētu MI tulkošanu.
Sagatavot Android projektu lokalizācijai
Android lokalizācijai izmanto uz mapēm balstītu nosacījumu. Noklusējuma virknes atrodas res/values/strings.xml, bet tulkotās — lokalizācijām specifiskās mapēs, piemēram, res/values-de/ un 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-rTWIzveidot strings.xml
Android virkņu resursos tiek izmantots XML ar '<string>' elementiem '<resources>' saknes elementā. Virkņu vietturiem izmantojiet %s, veseliem skaitļiem — %d, bet pozicionāliem argumentiem, kurus tulkotāji var pārkārtot, — %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>Apstrādāt daudzskaitli
Android izmanto '<plurals>' elementus ar quantity atribūtiem: zero, one, two, few, many, other. Katrai mērķa valodai var būt vajadzīgas atšķirīgas kategorijas — arābu izmanto visas 6, krievu valodai vajadzīgas few un many, bet japāņu izmanto tikai 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
) -->Izmantot kodā: Kotlin un Jetpack Compose
Tradicionālais Android izmanto getString(R.string.key) un resources.getQuantityString(). Jetpack Compose izmanto stringResource(R.string.key) un pluralStringResource(). Izpildlaikā abi atrod pareizo tulkojumu atbilstoši ierīces lokalizācijai.
// 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
))
}Virkņu masīvi un formatētas virknes
Sakārtotiem sarakstiem (piemēram, nolaižamās izvēlnes opcijām vai darba sākšanas soļiem) izmantojiet '<string-array>'. Formatētās virknēs izmantojiet pozicionālos formāta argumentus (%1$s, %2$d), lai tulkotāji varētu pārkārtot vārdus, nesabojājot teikuma struktūru.
<!-- 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>Lokalizēt Google Play metadatus ar Fastlane
Ar Fastlane komandu supply pārvaldiet Play Store metadatus — nosaukumu, īso un pilno aprakstu, kā arī izmaiņu žurnālus — savā repozitorijā kā pēc lokalizācijas sakārtotus vienkārša teksta failus.
# 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 supplyAutomatizējiet Play Store lapas lokalizāciju
Izlaidiet manuālu kopēšanu. Tulkojiet Play Store nosaukumu, aprakstu un laidiena piezīmes vairāk nekā 175 lokalizācijās, ievērojot rakstzīmju ierobežojumus.
Izpētīt Google Play integrācijuTestēt lokalizāciju
Testējiet ar emulatora lokalizācijas pārslēgšanu, Compose priekšskatījumiem ar pielāgotu LocaleList un pseidolokalizācijām izstrādātāja opcijās. Izmantojiet Gradle resConfigs, lai noņemtu nevajadzīgus trešo pušu bibliotēku lokalizāciju resursus.
// 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 mirroringAutomatizēt tulkojumu kvalitāti
Automatizēt tulkošanu
Tulkojiet strings.xml, daudzskaitli, virkņu masīvus un Fastlane Supply metadatus ar MI. Automatizējiet gan lietotnes virkņu, gan Play Store metadatu tulkošanu, lai nodrošinātu pilnībā lokalizētu klātbūtni.
# 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.2sPieejams Android Studio spraudnis
Tulkojiet Android XML resursus tieši no IDE ar i18n Agent spraudni IntelliJ / Android Studio.
Papildus: vieda lokalizācijas atkāpšanās ar LocaleChain
Android resursu atkāpšanos kārtību kontrolē operētājsistēma. Ja trūkst pt-BR tulkojumu, Android pilnībā izlaiž pt-PT un rāda angļu valodu. LocaleChain pārtver virkņu meklēšanu un iziet konfigurējamu atkāpšanās ķēdi, tādēļ reģionālie lietotāji redz tuvāko pieejamo tulkojumu.
LocaleChain for Android ir atvērtā pirmkoda Kotlin bibliotēka. Skatīt 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"))
)Biežākās kļūdas
Trūkstošu noklusējuma virkņu dēļ lietotne avarē
App Bundle valodu sadalīšana sabojā valodas pārslēgšanu lietotnē
RTL izkārtojumi tiek sabojāti
Bibliotēku resursu piesārņojums
Ieteicamā failu struktūra
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.ktsIzmēģiniet i18n Agent tūlīt
Nometiet tulkošanas failu šeit
JSON, YAML, PO, XML, CSV, Markdown, Properties
vai noklikšķiniet, lai izvēlētos
Mērķa valodas
Lokalizācijas atkāpšanās ar locale-chain-android
Ja reģionālajā lokalizācijā, piemēram, pt-BR, trūkst tulkojuma atslēgas, Android uzreiz pāriet uz noklusējuma resursu mapi, nevis vispirms pārbauda vecāklokalizāciju 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"),
)
)Pilnu atbalstīto sistēmu sarakstu un 75 iebūvētās ķēdes skatiet mūsu lokalizāciju atkāpšanās ceļvedī. Learn more →