Skip to main content

Täydellinen opas Android-sovellusten lokalisointiin

strings.xml-tiedostosta Play Store:n metatietoihin: lokalisoi Android-sovelluksesi Kotlin:illa, Jetpack Compose:lla, Fastlane:lla ja automaattisella tekoälykäännöksellä.

1

Valmistele Android-projektisi lokalisointiin

Android käyttää lokalisointiin kansiopohjaista käytäntöä. Oletusmerkkijonot ovat tiedostossa res/values/strings.xml ja käännetyt merkkijonot kieliversiokohtaisissa kansioissa, kuten 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
res/values/-kansio on varakieliversiosi. Jos kieliversiokohtaisesta kansiosta puuttuu merkkijono, Android lataa sen oletuksesta. Jos merkkijono kuitenkin puuttuu oletuksesta, sovellus kaatuu kieliversioilla, joita ei tueta.
2

Luo strings.xml

Android:in merkkijonoresurssit käyttävät XML:ää, jossa '<resources>'-juurielementti sisältää '<string>'-elementtejä. Käytä merkkijonojen paikkamerkkinä %s, kokonaisluvuille %d ja kääntäjien uudelleen järjesteltävinä sijaintiargumentteina %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>
Koodaamattomat heittomerkit kaatavat XML-jäsentimen ilman virheilmoitusta. Käytä \' tai ympäröi arvo lainausmerkeillä. Lisäksi oletusarvoisen values/strings.xml-tiedoston puuttuva merkkijono aiheuttaa täydellisen kaatumisen eikä hallittua varakieleen siirtymistä kuten iOS:ssä.
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

Käsittele monikkomuodot

Android käyttää '&lt;plurals&gt;'-elementtejä, joiden quantity-määritteet ovat zero, one, two, few, many ja other. Kukin kohdekieli voi tarvita eri luokat — arabia käyttää kaikkia kuutta, venäjä few- ja many-luokkia sekä japani vain other-luokkaa.

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-määrite valitsee monikkomuodon laitteen kieliversion CLDR-sääntöjen perusteella. Sisällytä varamuotona aina other — se on ainoa luokka, joka on varmasti olemassa kaikissa kielissä.
4

Käytä koodissa: Kotlin ja Jetpack Compose

Perinteinen Android käyttää getString(R.string.key)- ja resources.getQuantityString()-funktioita. Jetpack Compose käyttää stringResource(R.string.key)- ja pluralStringResource()-funktioita. Molemmat ratkaisevat suorituksen aikana oikean käännöksen laitteen kieliversion perusteella.

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) — count-parametri välitetään kahdesti. Ensimmäinen valitsee monikkomuodon, toinen on muotoiluargumentti. Toisen count-arvon puuttuminen on yleisin Composen monikkomuotovirhe.
5

Merkkijonotaulukot ja muotoillut merkkijonot

Käytä '&lt;string-array&gt;'-elementtiä järjestetyille luetteloille (esimerkiksi avattavan valikon vaihtoehdoille ja perehdytyksen vaiheille). Käytä muotoilluissa merkkijonoissa sijaintimuotoiluargumentteja (%1$s, %2$d), jotta kääntäjät voivat muuttaa sanajärjestystä rikkomatta lauserakennetta.

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>
Sijaintiargumentit, kuten %1$s, antavat kääntäjien järjestää parametrit vapaasti. 'Hello %1$s, you have %2$d items' voi muuttua eri sanajärjestystä käyttävissä kielissä muotoon '%2$d items for %1$s' ilman koodimuutoksia.
6

Lokalisoi Google Play:n metatiedot Fastlane:lla

Hallitse Play Store:n metatietoja — otsikkoa, lyhyttä kuvausta, koko kuvausta ja muutoslokeja — Fastlane:n supply-komennolla tietovarastossasi kieliversioittain järjestettyinä tekstitiedostoina.

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 -listauksen lokalisointi lisää latauksia yli 30 % muunkielisillä markkinoilla. Otsikko, lyhyt kuvaus ja koko kuvaus indeksoidaan hakua varten — niiden kääntäminen on kannattavin lokalisointityö, jonka voit tehdä.
Google Play

Automatisoi Play Store -listauksesi lokalisointi

Ohita manuaalinen kopiointi ja liittäminen. Käännä Play Store -otsikko, kuvaus ja julkaisutiedot yli 175 kieliversiolle merkkirajoitukset huomioiden.

Tutustu Google Play -integraatioon
7

Testaa lokalisointisi

Testaa emulaattorin kieliversion vaihdolla, mukautetun LocaleListin Compose-esikatseluilla ja kehittäjäasetusten pseudokieliversioilla. Poista kolmannen osapuolen kirjastojen tarpeettomat kieliversioresurssit Gradle:n resConfigs-asetuksella.

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
Testaa saksalla (teksti pitenee noin 30 %) ja japanilla (lyhenee noin 50 %) löytääksesi asetteluongelmat. Ota kehittäjäasetuksissa käyttöön pseudokieliversiot (en-XA aksenteille ja ar-XB oikealta vasemmalle kirjoitettavalle tekstille), jotta voit rasitustestata asettelut ilman oikeita käännöksiä.

Automatisoi käännöslaatu

Löydä puuttuvat avaimet, rikkoutuneet paikkamerkit ja monikkomuoto-ongelmat i18n-validate:lla ennen julkaisua. Testaa käyttöliittymää pseudokäännöksillä i18n-pseudo:n avulla ennen oikeiden käännösten valmistumista.
8

Automatisoi käännökset

Käännä strings.xml, monikkomuodot, merkkijonotaulukot ja Fastlane Supply:n metatiedot tekoälyllä. Automatisoi sekä sovelluksen sisäisten merkkijonojen että Play Store:n metatietojen kääntäminen täysin lokalisoitua näkyvyyttä varten.

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 käsittelee Android:in XML-koodauksen, säilyttää translatable="false"-merkinnät, noudattaa kunkin kohdekielen CLDR-monikkoluokkia ja pitää sijaintimuotoiluargumentit muuttumattomina.
JetBrains

Android Studio -lisäosa saatavilla

Käännä Android:in XML-resurssit suoraan IDE-ympäristöstäsi i18n Agent:in IntelliJ- tai Android Studio -lisäosalla.

Install
+

Lisävinkki: älykäs varakieli LocaleChain:illa

Android:in resurssien varakielitoiminta on käyttöjärjestelmän hallinnassa. Kun pt-BR-käännökset puuttuvat, Android ohittaa pt-PT:n kokonaan ja näyttää englannin. LocaleChain sieppaa merkkijonohaut ja käy läpi määritettävän varakieliketjun, joten alueelliset käyttäjät näkevät lähimmän saatavilla olevan käännöksen.

LocaleChain for Android on avoimen lähdekoodin Kotlin-kirjasto. Näytä GitHub:issa

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

Tavalliset sudenkuopat

Puuttuvat oletusmerkkijonot kaatavat sovelluksen

Toisin kuin käsittelemättömän avaimen näyttävä iOS, Android kaatuu ResourceNotFoundException-virheeseen, jos merkkijono puuttuu oletusarvoisesta res/values/strings.xml-tiedostosta. Varmista aina, että jokainen avain on oletustiedostossa.

App Bundle:n kielijaot rikkovat sovelluksen sisäisen kielenvaihdon

Google Play:n App Bundle -paketit jakavat APK:t kielittäin — käyttäjät saavat vain laitteensa kielen merkkijonot. Jos tarjoat kielenvaihdon sovelluksessa, lisää build.gradle.kts-tiedostoon bundle '{ language { enableSplit = false } }'.

RTL-asettelut rikkoutuvat

Syynä on left/right-arvojen käyttäminen start/end-arvojen sijaan asetteluissa tai puuttuva android:supportsRtl="true" AndroidManifest.xml-tiedostossa. Muunna nykyiset asettelut automaattisesti Android Studio:n valinnalla Refactor > Add RTL Support.

Kirjastoresurssien sekoittuminen

Kolmannen osapuolen kirjastot sisältävät omia values-XX/strings.xml-tiedostojaan, minkä vuoksi Android luulee sovelluksesi tukevan kieliä, joita se ei tue. Rajoita mukaan otetut kieliversiot vain itse kääntämiisi käyttämällä build.gradle.kts-tiedostossa resConfigs-asetusta.

Suositeltu tiedostorakenne

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

Kokeile i18n Agent:ia nyt

Pudota käännöstiedostosi tähän

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

tai valitse napsauttamalla

Kohdekielet

Rekisteröitymistä ei tarvitaVälitön arvio

Varakieliketju locale-chain-androidilla

Kun alueellisesta kieliversiosta, kuten pt-BR:stä, puuttuu käännösavain, Android siirtyy suoraan oletusresurssikansioon eikä tarkista ensin pääkieliversiota 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"),
    )
)

Katso varakielioppaastamme kaikki tuetut ohjelmistokehykset ja 75 sisäänrakennettua ketjua. Learn more →

Usein kysyttyä Android-lokalisoinnista