localize.dev

Documenti / Android

Risorse stringa Android, automatizzate

Sposta il testo hardcoded nei layout Android, Jetpack Compose e nel codice View (Kotlin o Java) nelle risorse stringa: strings.xml per lingua, chiamate stringResource() e l'elenco delle lingue per app.

Come funziona

Nei layout e nei menu, android:text, hint, contentDescription e title diventano @string/…. In Compose, Text("…") e contentDescription = "…" all'interno delle funzioni @Composable diventano stringResource(R.string.…, args); i toast usano context.getString.

Anche il codice View in Kotlin o Java funziona: label.setText("…"), setHint, setTitle e pulsanti di dialogo, e label.text = "…" di Kotlin, diventano setText(R.string.…). Viene segnalato un testo di visualizzazione creato da valori, poiché setText non accetta argomenti di formato.

I segnaposto diventano %1$s, %2$s… numerati in base al loro ordine nel testo di origine, in modo che una traduzione possa riordinarli.

Un conteggio con la sua parola, "$n ${if (n == 1) "item" else "items"}", diventa una risorsa <plurals> letta con pluralStringResource(R.plurals.…, n, n) (o getQuantityString in un toast).

Prima e dopo

L'output effettivo del motore per questo file. In un'esecuzione reale, il modello ospitato nomina le chiavi dal contesto.

app/src/main/java/com/acme/shop/ui/Cart.kt · prima
@Composable
fun Cart(name: String) {
    Column {
        Text("Welcome back, $name!")
        Text(text = "Checkout")
    }
}
app/src/main/java/com/acme/shop/ui/Cart.kt · dopo
import androidx.compose.ui.res.stringResource

@Composable
fun Cart(name: String) {
    Column {
        Text(stringResource(R.string.cart_welcome_back, name))
        Text(text = stringResource(R.string.cart_checkout))
    }
}
res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="cart_welcome_back">Welcome back, %1$s!</string>
    <string name="cart_checkout">Checkout</string>
</resources>

Cosa aggiunge la configurazione

La prima esecuzione imposta Risorse stringa Android se il progetto non lo ha ancora:

  • res/values/strings.xml e res/values-<lang>/strings.xml
  • res/xml/locales_config.xml e android:localeConfig, così Android 13+ elenca le lingue nelle impostazioni dell'app

Eseguilo

La CLI richiede Node.js 22 o versioni successive, nient'altro: npx lo esegue senza aggiungere un package.json al progetto. Non hai Node sulla tua macchina? La GitHub Action qui sotto lo esegue per te.

npx localize-dev login

# Preview, then write the changes
npx localize-dev run --dry-run -l es,fr,de
npx localize-dev run -l es,fr,de

# Or open a pull request instead
npx localize-dev pr -l es,fr,de

Oppure aggiungi la GitHub Action e ottieni una pull request a ogni push. Provalo prima sul tuo codice nel playground.