Skip to main content

Täielik Android'i rakenduse lokaliseerimise juhend

strings.xml-failist Play Store'i metaandmeteni: lokaliseeri oma Android'i rakendus Kotlin'i, Jetpack Compose'i, Fastlane'i ja automaatse tehisintellekti tõlkega.

1

Seadista Android'i projekt lokaliseerimiseks

Android kasutab lokaliseerimiseks kaustapõhist tava. Vaikestringid asuvad failis res/values/strings.xml ning tõlgitud stringid lokaadipõhistes kaustades, nagu res/values-de/ ja 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
Kaust res/values/ on sinu varulokaat. Kui lokaadipõhisest kaustast string puudub, laadib Android selle vaikeväärtustest. Kui string puudub aga vaikeväärtustest, jookseb rakendus toetamata lokaatides kokku.
2

Loo strings.xml

Android'i stringiressursid kasutavad XML-i, kus juurelemendi '<resources>' sees on elemendid '<string>'. Kasuta stringi kohatäitjana %s, täisarvude jaoks %d ning tõlkijate ümberjärjestatavate positsiooniargumentidena %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>
Varjestamata ülakomad jooksutavad XML-parseri vaikselt kokku. Kasuta \' või ümbritse väärtus jutumärkidega. Lisaks põhjustab vaikimisi values/strings.xml-failist puuduv string täieliku krahhi, mitte sujuvat varuväärtusele üleminekut nagu iOS-is.
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

Töötle mitmusevorme

Android kasutab elemente '&lt;plurals&gt;', mille quantity-atribuudid on zero, one, two, few, many ja other. Iga sihtkeel võib vajada eri kategooriaid — araabia keel kasutab kõiki kuut, vene keel kategooriaid few ja many ning jaapani keel ainult other-kategooriat.

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
) -->
Atribuut quantity valib mitmusevormi seadme lokaadi CLDR-i reeglite alusel. Lisa varuvormina alati other — see on ainus kategooria, mis on kindlasti olemas igas keeles.
4

Kasuta koodis: Kotlin ja Jetpack Compose

Tavapärane Android kasutab funktsioone getString(R.string.key) ja resources.getQuantityString(). Jetpack Compose kasutab funktsioone stringResource(R.string.key) ja pluralStringResource(). Mõlemad leiavad käitusajal seadme lokaadi järgi õige tõlke.

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) — parameeter count edastatakse kaks korda. Esimene valib mitmusevormi, teine on vormindusargument. Teise count-väärtuse puudumine on Compose'i kõige levinum mitmusevormiviga.
5

Stringimassiivid ja vormindatud stringid

Kasuta elementi '&lt;string-array&gt;' järjestatud loendite jaoks (nt rippmenüü valikud ja kasutuselevõtu etapid). Kasuta vormindatud stringides positsioonilisi vormindusargumente (%1$s, %2$d), et tõlkijad saaksid sõnu lauseehitust rikkumata ümber järjestada.

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>
Positsiooniargumendid, nagu %1$s, võimaldavad tõlkijatel parameetreid vabalt ümber järjestada. 'Hello %1$s, you have %2$d items' võib teise sõnajärjega keeltes muutuda kujule '%2$d items for %1$s' ilma koodimuudatusteta.
6

Lokaliseeri Google Play metaandmed Fastlane'iga

Halda Play Store'i metaandmeid — pealkirja, lühikirjeldust, täiskirjeldust ja muudatuste logisid — Fastlane'i käsuga supply hoidlas lokaadi järgi korraldatud lihttekstifailidena.

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'i kirje lokaliseerimine suurendab mitteingliskeelsetel turgudel allalaadimisi enam kui 30%. Pealkiri, lühikirjeldus ja täiskirjeldus indekseeritakse otsingu jaoks — nende tõlkimine on suurima tasuvusega lokaliseerimine, mida saad teha.
Google Play

Automatiseeri Play Store'i kirje lokaliseerimine

Jäta käsitsi kopeerimine ja kleepimine vahele. Tõlgi Play Store'i pealkiri, kirjeldus ja väljalaskemärkmed enam kui 175 lokaati, arvestades tähemärgipiiranguid.

Tutvu Google Play lõiminguga
7

Testi lokaliseerimist

Testi emulaatori lokaadivahetuse, kohandatud LocaleListiga Compose'i eelvaadete ja arendaja valikute pseudolokaatidega. Eemalda Gradle'i resConfigs-seadistusega kolmanda osapoole teekidest soovimatud lokaadiressursid.

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
Testi saksa keelega (tekst pikeneb umbes 30%) ja jaapani keelega (lüheneb umbes 50%), et leida paigutusprobleemid. Luba arendaja valikutes pseudolokaadid (en-XA rõhumärkidega teksti ja ar-XB paremalt vasakule teksti jaoks), et koormustestida paigutusi ilma päris tõlgeteta.

Automatiseeri tõlkekvaliteet

Leia i18n-validate'i abil puuduvad võtmed, katkised kohatäitjad ja mitmusevormide probleemid enne avaldamist. Testi kasutajaliidest i18n-pseudo abil pseudotõlgetega enne päris tõlgete saabumist.
8

Automatiseeri tõlked

Tõlgi strings.xml, mitmusevormid, stringimassiivid ja Fastlane Supply metaandmed tehisintellektiga. Automatiseeri nii rakendusesiseste stringide kui ka Play Store'i metaandmete tõlkimine täielikult lokaliseeritud kohalolu jaoks.

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 töötleb Android'i XML-varjestust, säilitab translatable="false" märgendid, järgib iga sihtkeele CLDR-i mitmusekategooriaid ning hoiab positsioonilised vormindusargumendid puutumatuna.
JetBrains

Android Studio plugin on saadaval

Tõlgi Android'i XML-ressursse otse oma IDE-st i18n Agent'i IntelliJ / Android Studio pluginaga.

Install
+

Lisavõimalus: nutikas varulokaat LocaleChain'iga

Android'i ressursside varulokaadi juhib operatsioonisüsteem. Kui pt-BR tõlked puuduvad, jätab Android pt-PT täielikult vahele ja kuvab inglise keele. LocaleChain püüab stringiotsingud kinni ning läbib seadistatava varulokaadiahela, nii et piirkondlikud kasutajad näevad lähimat saadaolevat tõlget.

LocaleChain for Android on avatud lähtekoodiga Kotlin'i teek. Vaata GitHub'is

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

Levinud komistuskivid

Puuduvad vaikestringid põhjustavad krahhi

Erinevalt iOS-ist, mis kuvab töötlemata võtme, jookseb Android ResourceNotFoundExceptioniga kokku, kui string puudub vaikimisi res/values/strings.xml-failist. Veendu alati, et iga võti oleks vaikefailis olemas.

App Bundle'i keelejaotused rikuvad rakendusesisese keelevahetuse

Google Play App Bundle'id jagavad APK-d keele järgi — kasutajad saavad ainult oma seadme keele stringid. Kui pakud rakendusesisest keelevahetust, lisa faili build.gradle.kts bundle '{ language { enableSplit = false } }'.

RTL-paigutused lähevad katki

Põhjuseks on paigutustes left/right kasutamine start/end asemel või puuduv android:supportsRtl="true" failis AndroidManifest.xml. Teisenda olemasolevad paigutused automaatselt Android Studio käsuga Refactor > Add RTL Support.

Teegiressursside saastumine

Kolmanda osapoole teegid sisaldavad oma values-XX/strings.xml-faile, mistõttu Android arvab, et sinu rakendus toetab keeli, mida see tegelikult ei toeta. Piira build.gradle.kts-failis resConfigsiga kaasatud lokaadid ainult nendele, mida päriselt tõlgid.

Soovituslik failistruktuur

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

Proovi i18n Agent'i kohe

Kukuta tõlkefail siia

JSON, YAML, PO, XML, CSV, Markdown, Properties

või klõpsa faili valimiseks

Sihtkeeled

Registreerumine pole vajalikKohene hinnang

Varulokaat locale-chain-androidiga

Kui piirkondlikust lokaadist, näiteks pt-BR-st, puudub tõlkevõti, liigub Android otse vaikeressursside kausta ega kontrolli esmalt põhilokaati 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"),
    )
)

Vaata meie varulokaadi juhendist kõigi toetatud raamistike ja 75 sisseehitatud ahela loendit. Learn more →

Android'i lokaliseerimise KKK