Skip to main content

Celovit vodnik po lokalizaciji aplikacij Android

Od strings.xml do metapodatkov Play Store: lokalizirajte svojo aplikacijo Android s Kotlinom, Jetpack Compose, Fastlane in samodejnim prevajanjem z umetno inteligenco.

1

Pripravite svoj projekt Android za lokalizacijo

Android za lokalizacijo uporablja dogovor na podlagi map. Vaša privzeta besedila so v res/values/strings.xml, prevedena pa v mapah posameznih jezikovnih različic, kot sta res/values-de/ in 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
Mapa res/values/ je Vaša nadomestna jezikovna različica. Če v mapi posamezne različice manjka besedilo, ga Android naloži iz privzete mape. Če pa besedilo manjka v privzeti različici, se Vaša aplikacija v nepodprtih jezikovnih različicah sesuje.
2

Ustvarite strings.xml

Besedilni viri Android uporabljajo XML z elementi '<string>' znotraj korena '<resources>'. Za besedilne označbe mest uporabite %s, za cela števila %d, za položajne argumente, ki jih prevajalci lahko prerazporedijo, pa %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>
Neubežani opuščaji neopazno sesujejo razčlenjevalnik XML. Uporabite \' ali vrednost zapišite v dvojnih narekovajih. Poleg tega manjkajoče besedilo v privzeti values/strings.xml povzroči popolno sesutje, ne varnega nadomestila kot v 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

Obravnavajte množinske oblike

Android uporablja elemente '&lt;plurals&gt;' z atributi quantity: zero, one, two, few, many in other. Vsak ciljni jezik lahko potrebuje druge kategorije: arabščina uporablja vseh 6, ruščina potrebuje few/many, japonščina pa samo 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
) -->
Atribut quantity izbere množinsko obliko na podlagi pravil CLDR za jezikovno različico naprave. Vedno vključite 'other' kot nadomestilo: to je edina kategorija, ki zagotovo obstaja v vsakem jeziku.
4

Uporaba v kodi: Kotlin in Jetpack Compose

Tradicionalni Android uporablja getString(R.string.key) in resources.getQuantityString(). Jetpack Compose uporablja stringResource(R.string.key) in pluralStringResource(). Oboje med izvajanjem razreši pravilni prevod glede na jezikovno različico naprave.

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 se poda dvakrat. Prvi izbere množinsko obliko, drugi je oblikovni argument. Manjkajoči drugi count je najpogostejša napaka pri množinskih oblikah v Compose.
5

Besedilna polja in oblikovana besedila

Za urejene sezname (na primer možnosti spustnega seznama ali korake uvajanja) uporabite '&lt;string-array&gt;'. V oblikovanih besedilih uporabite položajne oblikovne argumente (%1$s, %2$d), da lahko prevajalci spremenijo vrstni red besed, ne da bi porušili strukturo povedi.

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>
Položajni argumenti, kot je %1$s, prevajalcem omogočajo poljubno prerazporejanje parametrov. 'Hello %1$s, you have %2$d items' lahko v jezikih z drugačnim vrstnim redom besed postane '%2$d items for %1$s' brez sprememb kode.
6

Lokalizirajte metapodatke Google Play s Fastlane

Z ukazom supply iz Fastlane upravljajte metapodatke Play Store — naslov, kratek opis, celoten opis in dnevnike sprememb — kot navadne besedilne datoteke, razvrščene po jezikovnih različicah v Vašem repozitoriju.

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
Lokalizacija Vaše strani v Play Store na neangleških trgih poveča število prenosov za več kot 30 %. Naslov, kratki opis in celotni opis se indeksirajo za iskanje, zato je njihov prevod lokalizacija z največjo donosnostjo, ki jo lahko izvedete.
Google Play

Avtomatizirajte lokalizacijo svoje strani v Play Store

Preskočite ročno kopiranje in lepljenje. Naslov, opis in opombe ob izdaji v Play Store prevedite v več kot 175 jezikovnih različic ob upoštevanju omejitev znakov.

Raziščite integracijo Google Play
7

Preizkusite svojo lokalizacijo

Preizkušajte s preklapljanjem jezikovne različice emulatorja, predogledi Compose s prilagojenim LocaleList in psevdorazličicami v Developer Options. Z resConfigs v Gradle odstranite neželene jezikovne vire iz knjižnic drugih ponudnikov.

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
Preizkusite z nemščino (besedilo se podaljša za približno 30 %) in japonščino (skrajša se za približno 50 %), da odkrijete težave s postavitvijo. V Developer Options omogočite psevdorazličici (en-XA za naglašeno besedilo, ar-XB za RTL) in obremenitveno preizkusite postavitve brez pravih prevodov.

Avtomatizirajte kakovost prevodov

Z i18n-validate odkrijte manjkajoče ključe, poškodovane označbe mest in težave z množinskimi oblikami, preden dosežejo uporabnike. Z i18n-pseudo preizkusite uporabniški vmesnik s psevdoprevodi, preden prispejo pravi prevodi.
8

Avtomatizirajte prevode

Svoje strings.xml, množinske oblike, besedilna polja in metapodatke Fastlane Supply prevedite z umetno inteligenco. Avtomatizirajte prevajanje besedil v aplikaciji in metapodatkov Play Store za povsem lokalizirano prisotnost.

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 obravnava ubežne znake v XML za Android, ohrani oznake translatable="false", upošteva množinske kategorije CLDR posameznega ciljnega jezika in ohrani položajne oblikovne argumente.
JetBrains

Na voljo je vtičnik za Android Studio

Z vtičnikom i18n Agent za IntelliJ/Android Studio prevajajte vire XML za Android neposredno iz svojega razvojnega okolja IDE.

Install
+

Dodatek: pametno nadomeščanje jezikovnih različic z LocaleChain

Nadomeščanje virov Android nadzira operacijski sistem. Ko prevodi pt-BR manjkajo, Android povsem preskoči pt-PT in pokaže angleščino. LocaleChain prestreže iskanja besedil in prehodi nastavljivo nadomestno verigo, zato regionalni uporabniki vidijo najbližji razpoložljivi prevod.

LocaleChain za Android je odprtokodna knjižnica Kotlin. Oglejte si jo na GitHubu

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

Pogoste pasti

Manjkajoča privzeta besedila povzročijo sesutje

Android se za razliko od iOS, ki pokaže neobdelani ključ, sesuje z ResourceNotFoundException, če besedilo manjka v privzeti res/values/strings.xml. Vedno poskrbite, da v privzeti datoteki obstaja vsak ključ.

Jezikovna delitev svežnjev App Bundle pokvari preklapljanje v aplikaciji

Google Play App Bundle razdeli datoteke APK po jeziku, zato uporabniki prejmejo samo besedila jezika svoje naprave. Če ponujate preklapljanje jezika v aplikaciji, v build.gradle.kts dodajte bundle '{ language { enableSplit = false } }'.

Porušene postavitve RTL

Vzrok je uporaba left/right namesto start/end v postavitvah ali manjkajoči android:supportsRtl="true" v AndroidManifest.xml. Z Refactor > Add RTL Support v Android Studio samodejno pretvorite obstoječe postavitve.

Onesnaženje z viri knjižnic

Knjižnice drugih ponudnikov vključujejo lastne datoteke values-XX/strings.xml, zato Android zmotno meni, da Vaša aplikacija podpira jezike, ki jih ne. Z resConfigs v build.gradle.kts vključene jezikovne različice omejite samo na tiste, ki jih dejansko prevajate.

Priporočena struktura datotek

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

Preizkusite i18n Agent zdaj

Spustite prevajalsko datoteko sem

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

ali kliknite za izbiro

Ciljni jeziki

Registracija ni potrebnaTakojšnja ocena

Nadomestne jezikovne različice z locale-chain-android

Ko v regionalni jezikovni različici, kot je pt-BR, manjka prevajalski ključ, Android preskoči naravnost na privzeto mapo virov, namesto da bi najprej preveril nadrejeno različico 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"),
    )
)

V našem vodniku po nadomestnih jezikovnih različicah si oglejte celoten seznam podprtih ogrodij in 75 vgrajenih verig. Learn more →

Pogosta vprašanja o lokalizaciji Androida