Skip to main content

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.

1

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
// 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
Mape res/values/ ir atkāpšanās lokalizācija. Ja lokalizācijai specifiskajā mapē trūkst virknes, Android ielādē to no noklusējuma mapes. Taču, ja virknes trūkst noklusējuma mapē, lietotne neatbalstītās lokalizācijās avarē.
2

Izveidot 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
<!-- 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>
Neekranētu apostrofu dēļ XML parsētājs klusām avarē. Izmantojiet \' vai ietveriet vērtību dubultpēdiņās. Turklāt, ja noklusējuma values/strings.xml trūkst virknes, lietotne nevis nemanāmi atkāpjas kā iOS, bet pilnībā avarē.
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

Apstrādāt daudzskaitli

Android izmanto '&lt;plurals&gt;' 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
<!-- 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 atribūts izvēlas daudzskaitļa formu atbilstoši ierīces lokalizācijas CLDR kārtulām. Vienmēr iekļaujiet other kā atkāpšanās variantu — tā ir vienīgā kategorija, kas garantēti pastāv katrā valodā.
4

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.

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) — parametrs count tiek nodots divreiz. Pirmais izvēlas daudzskaitļa formu, otrais ir formāta arguments. Otrā count izlaišana ir biežākā Compose daudzskaitļa kļūda.
5

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 '&lt;string-array&gt;'. 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
<!-- 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>
Tādi pozicionālie argumenti kā %1$s ļauj tulkotājiem brīvi pārkārtot parametrus. „Sveiki, %1$s, jums ir %2$d vienumi“ valodās ar citu vārdu secību var kļūt par „%2$d vienumi lietotājam %1$s“ bez koda izmaiņām.
6

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.

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
Lokalizējot Play Store lapu tirgos, kuros nerunā angliski, lejupielāžu skaits palielinās par vairāk nekā 30%. Nosaukums, īsais un pilnais apraksts tiek indeksēts meklēšanā, tādēļ to tulkošana ir lokalizācijas darbs ar visaugstāko atdevi.
Google Play

Automatizē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āciju
7

Testē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.

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
Testējiet vācu valodu (teksts ir par aptuveni 30% garāks) un japāņu valodu (par aptuveni 50% īsāks), lai atrastu izkārtojuma problēmas. Izstrādātāja opcijās iespējojiet pseidolokalizācijas (en-XA diakritiskajām zīmēm, ar-XB RTL), lai pārbaudītu izkārtojumus bez īstiem tulkojumiem.

Automatizēt tulkojumu kvalitāti

Ar i18n-validate pirms izlaišanas atrodiet trūkstošās atslēgas, bojātos vietturus un daudzskaitļa problēmas. Kamēr īstie tulkojumi vēl nav gatavi, pārbaudiet UI ar i18n-pseudo pseidotulkojumiem.
8

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.

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 pareizi apstrādā Android XML ekranēšanu, saglabā translatable="false" marķierus, ievēro CLDR daudzskaitļa kategorijas katrai mērķa valodai un nemaina pozicionālos formāta argumentus.
JetBrains

Pieejams Android Studio spraudnis

Tulkojiet Android XML resursus tieši no IDE ar i18n Agent spraudni IntelliJ / Android Studio.

Install
+

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

Biežākās kļūdas

Trūkstošu noklusējuma virkņu dēļ lietotne avarē

Atšķirībā no iOS, kas rāda neapstrādāto atslēgu, Android izraisa ResourceNotFoundException un avarē, ja noklusējuma res/values/strings.xml failā trūkst virknes. Vienmēr nodrošiniet, ka noklusējuma failā ir katra atslēga.

App Bundle valodu sadalīšana sabojā valodas pārslēgšanu lietotnē

Google Play App Bundle sadala APK pēc valodas, tādēļ lietotāji saņem tikai ierīces valodas virknes. Ja lietotnē piedāvājat valodas pārslēgšanu, pievienojiet bundle '{ language { enableSplit = false } }' failam build.gradle.kts.

RTL izkārtojumi tiek sabojāti

Izkārtojumos tiek izmantots left/right, nevis start/end, vai AndroidManifest.xml trūkst android:supportsRtl="true". Lai automātiski pārveidotu esošos izkārtojumus, izmantojiet Android Studio Refactor > Add RTL Support.

Bibliotēku resursu piesārņojums

Trešo pušu bibliotēkas iekļauj savus values-XX/strings.xml failus, tādēļ Android uzskata, ka lietotne atbalsta valodas, kuras patiesībā neatbalsta. Ar resConfigs failā build.gradle.kts ierobežojiet iekļautās lokalizācijas tikai līdz tām, kuras patiešām tulkojat.

Ieteicamā failu struktūra

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

Izmēģ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

Reģistrācija nav vajadzīgaTūlītēja tāme

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.

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

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 →

Bieži uzdotie jautājumi par Android lokalizāciju