Skip to main content

Kompletný sprievodca lokalizáciou aplikácií pre Android

Od strings.xml po metadáta v Obchode Play: lokalizujte svoju aplikáciu pre Android pomocou Kotlinu, Jetpack Compose, Fastlane a automatizovaného prekladu pomocou AI.

1

Pripravte svoj projekt pre Android na lokalizáciu

Android používa na lokalizáciu konvenciu so zložkami. Predvolené texty sa nachádzajú v res/values/strings.xml a preložené texty patria do zložiek pre konkrétne miestne nastavenia, napríklad res/values-de/, res/values-ja/ atď.

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
Zložka res/values/ predstavuje záložné miestne nastavenie. Ak text chýba v zložke pre konkrétne miestne nastavenie, Android ho načíta z predvoleného umiestnenia. Ak však text chýba v predvolenom umiestnení, aplikácia v nepodporovaných miestnych nastaveniach zlyhá.
2

Vytvorte strings.xml

Textové zdroje Androidu používajú XML s prvkami '<string>' v koreňovom prvku '<resources>'. Pre textové zástupné symboly používajte %s, pre celé čísla %d a pre pozičné argumenty, ktorých poradie môžu prekladatelia zmeniť, používajte %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>
Neuvedené apostrofy spôsobia tiché zlyhanie syntaktického analyzátora XML. Použite \' alebo hodnotu uzavrite do dvojitých úvodzoviek. Navyše chýbajúci text v predvolenom values/strings.xml spôsobí úplné zlyhanie, nie plynulé použitie záložnej hodnoty ako v systéme iOS.
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

Spracujte množné číslo

Android používa prvky '&lt;plurals&gt;' s atribútmi množstva: zero, one, two, few, many, other. Každý cieľový jazyk môže vyžadovať iné kategórie – arabčina používa všetkých 6, ruština potrebuje few/many a japončina používa iba 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
) -->
Atribút quantity vyberá tvar množného čísla podľa pravidiel CLDR pre miestne nastavenie zariadenia. Vždy uveďte 'other' ako záložnú možnosť – je to jediná kategória, ktorej existencia je zaručená v každom jazyku.
4

Použite lokalizované texty v kóde: Kotlin a Jetpack Compose

Tradičný Android používa getString(R.string.key) a resources.getQuantityString(). Jetpack Compose používa stringResource(R.string.key) a pluralStringResource(). Obe možnosti počas behu aplikácie vyberú správny preklad podľa miestneho nastavenia zariadenia.

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) – parameter count sa odovzdáva dvakrát. Prvý vyberá tvar množného čísla, druhý predstavuje formátovací argument. Vynechanie druhého parametra count je najčastejšou chybou pri používaní množného čísla v Compose.
5

Polia textov a formátované texty

Pre zoradené zoznamy (napríklad možnosti rozbaľovacej ponuky alebo kroky úvodného nastavenia) používajte '&lt;string-array&gt;'. Vo formátovaných textoch používajte pozičné formátovacie argumenty (%1$s, %2$d), aby prekladatelia mohli zmeniť poradie slov bez narušenia štruktúry vety.

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>
Pozičné argumenty, napríklad %1$s, umožňujú prekladateľom ľubovoľne meniť poradie parametrov. Text „Dobrý deň, %1$s, máte %2$d položiek“ sa môže v jazykoch s odlišným slovosledom zmeniť na „%2$d položiek pre používateľa %1$s“ bez akejkoľvek zmeny kódu.
6

Lokalizujte metadáta v službe Google Play pomocou Fastlane

Pomocou príkazu supply nástroja Fastlane spravujte metadáta v Obchode Play – názov, krátky opis, úplný opis a zoznamy zmien – ako obyčajné textové súbory usporiadané v repozitári podľa miestnych nastavení.

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ácia záznamu v Obchode Play zvyšuje počet stiahnutí na neanglických trhoch o viac ako 30 %. Názov, krátky opis a úplný opis sa indexujú na vyhľadávanie, preto ich preklad prináša najvyššiu návratnosť spomedzi lokalizačných činností.
Google Play

Automatizujte lokalizáciu svojho záznamu v Obchode Play

Vynechajte ručné kopírovanie a vkladanie. Preložte názov, opis a poznámky k vydaniu v Obchode Play do viac ako 175 miestnych nastavení so zohľadnením obmedzení počtu znakov.

Preskúmať integráciu so službou Google Play
7

Otestujte lokalizáciu

Testujte prepínanie miestnych nastavení v emulátore, ukážky Compose s vlastným LocaleList a pseudomiestne nastavenia v možnostiach pre vývojárov. Pomocou resConfigs v Gradle odstráňte nechcené jazykové zdroje z knižníc tretích strán.

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
Testujte s nemčinou (text sa predĺži približne o 30 %) a japončinou (skráti sa približne o 50 %), aby ste odhalili problémy s rozložením. V možnostiach pre vývojárov povoľte pseudomiestne nastavenia (en-XA pre znaky s diakritikou, ar-XB pre zápis sprava doľava), aby ste mohli dôkladne otestovať rozloženia bez skutočných prekladov.

Automatizujte kontrolu kvality prekladu

Pomocou i18n-validate odhaľte chýbajúce kľúče, poškodené zástupné symboly a problémy s množným číslom ešte pred vydaním. Kým budú hotové skutočné preklady, otestujte používateľské rozhranie pomocou pseudoprekladov vytvorených nástrojom i18n-pseudo.
8

Automatizujte preklady

Prekladajte strings.xml, tvary množného čísla, polia textov a metadáta Fastlane Supply pomocou AI. Automatizujte preklad textov v aplikácii aj metadát v Obchode Play a zabezpečte tak úplne lokalizovanú prezentáciu.

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 spracúva escapovanie XML v Androide, zachováva značky translatable="false", rešpektuje kategórie množného čísla CLDR pre jednotlivé cieľové jazyky a nemení pozičné formátovacie argumenty.
JetBrains

K dispozícii je doplnok pre Android Studio

Prekladajte zdroje XML pre Android priamo vo svojom IDE pomocou doplnku i18n Agent pre IntelliJ / Android Studio.

Install
+

Bonus: inteligentné použitie záložných miestnych nastavení pomocou LocaleChain

Použitie záložných zdrojov v Androide riadi operačný systém. Keď chýbajú preklady pt-BR, Android úplne preskočí pt-PT a zobrazí angličtinu. LocaleChain zachytáva vyhľadávanie textov a prechádza konfigurovateľným reťazcom záložných možností, takže používatelia z jednotlivých regiónov uvidia najbližší dostupný preklad.

LocaleChain pre Android je knižnica Kotlin s otvoreným zdrojovým kódom. Zobraziť na GitHube

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

Bežné nástrahy

Chýbajúce predvolené texty spôsobujú zlyhania

Na rozdiel od systému iOS, ktorý zobrazí nespracovaný kľúč, Android zlyhá s výnimkou ResourceNotFoundException, ak text chýba v predvolenom res/values/strings.xml. Vždy sa uistite, že predvolený súbor obsahuje každý kľúč.

Jazykové rozdelenie balíka App Bundle znemožňuje prepínanie v aplikácii

Google Play App Bundles rozdeľuje súbory APK podľa jazyka – používatelia dostanú iba texty pre jazyk svojho zariadenia. Ak ponúkate prepínanie jazyka v aplikácii, pridajte bundle '{ language { enableSplit = false } }' do svojho build.gradle.kts.

Narušené rozloženia sprava doľava

Príčinou môže byť používanie left/right namiesto start/end v rozloženiach alebo chýbajúce android:supportsRtl="true" v AndroidManifest.xml. Existujúce rozloženia automaticky skonvertujte pomocou Android Studio's Refactor > Add RTL Support.

Nežiaduce jazykové zdroje z knižníc

Knižnice tretích strán obsahujú vlastné súbory values-XX/strings.xml, preto Android považuje Vašu aplikáciu za dostupnú aj v jazykoch, ktoré nepodporuje. Pomocou resConfigs v build.gradle.kts obmedzte zahrnuté miestne nastavenia iba na tie, do ktorých skutočne prekladáte.

Odporúčaná štruktúra súborov

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

Vyskúšajte i18n Agent teraz

Potiahnite súbor na preklad sem

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

alebo kliknite a vyberte súbor

Cieľové jazyky

Bez registrácieOkamžitý odhad

Použitie záložných miestnych nastavení pomocou locale-chain-android

Keď v regionálnom miestnom nastavení, napríklad pt-BR, chýba prekladový kľúč, Android prejde priamo do predvoleného priečinka zdrojov namiesto toho, aby najskôr skontroloval nadradené miestne nastavenie 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"),
    )
)

Úplný zoznam podporovaných frameworkov a 75 vstavaných reťazcov nájdete v našom sprievodcovi použitím záložných miestnych nastavení. Learn more →

Časté otázky o lokalizácii pre Android