Come localizzare la tua app Android con l'IA
Configura le cartelle values/, traduci strings.xml con l'IA, cambia lingua in Kotlin, quindi carica le schermate in modo che PTC (Private Translation Cloud) faccia la revisione dell'app Android in esecuzione. Alla fine di questa guida avrai un'app Android multilingua pronta per essere rilasciata, con ogni lingua di destinazione verificata tramite revisione visiva prima della release.
Questa guida dà per scontato che tu abbia un progetto Android esistente in Android Studio. Se parti da zero, genera prima la struttura di un nuovo progetto con il template Empty Activity.
Come Android risolve le risorse localizzate dalle cartelle values-{locale}/
Android organizza le risorse localizzate in cartelle res/values-{locale}/ all'interno di app/src/main/. La cartella predefinita è values/, che contiene le stringhe della lingua di origine. Ogni lingua di destinazione ha la propria cartella values-{locale}/.
app/src/main/res/
values/strings.xml # source language (typically English) - REQUIRED
values-es/strings.xml # Spanish
values-fr/strings.xml # French
values-de/strings.xml # German
values-ja/strings.xml # Japanese
values-zh-rCN/strings.xml # Simplified Chinese (region-specific)
Includi sempre la cartella predefinita values/ senza un codice lingua. Quello è il tuo fallback. Android sceglie la cartella giusta a runtime in base al locale del dispositivo dell'utente. Se la lingua dell'utente è lo spagnolo ma non hai values-es/, Android usa values/ come fallback. Il fallback è silenzioso. Un'app tradotta parzialmente mostra inglese mescolato allo spagnolo, senza alcun errore.
I codici locale seguono lo standard BCP 47. es per lo spagnolo, pt-rBR per il portoghese brasiliano (nota il prefisso r per la regione), zh-rCN per il cinese semplificato.
Sposta ogni stringa rivolta all'utente in strings.xml
Usa sempre le risorse stringa archiviate in strings.xml. Non inserire mai testo hardcoded direttamente nel codice Kotlin/Java o in un attributo di layout android:text=. Il testo hardcoded non può essere tradotto.
Sposta ogni stringa rivolta all'utente in res/values/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Notes</string>
<string name="welcome_message">Welcome, %1$s!</string>
<string name="notes_count_zero">No notes yet</string>
<plurals name="notes_count">
<item quantity="one">%d note</item>
<item quantity="other">%d notes</item>
</plurals>
<string-array name="categories">
<item>Personal</item>
<item>Work</item>
<item>Travel</item>
</string-array>
</resources>
Fai riferimento a ogni stringa in Kotlin tramite l'ID R.string.* generato:
val appName = stringResource(R.string.app_name)
val welcome = stringResource(R.string.welcome_message, userName)
val counts = pluralStringResource(R.plurals.notes_count, notes.size, notes.size)
Convenzioni chiave che PTC rispetta:
- Segnaposto posizionali. Usa
%1$s,%2$d,%3$finvece di%s,%d. Alcune lingue hanno bisogno di riordinare gli argomenti. I segnaposto posizionali lo rendono possibile. PTC li riconosce e li preserva automaticamente. <plurals>per i sostantivi numerabili. Non scrivereif (count == 1) "1 note" else "$count notes"nel codice. Usa<plurals>con le quantitàone/other/few/many. PTC genera le categorie di plurali corrette per lingua di destinazione (1 forma per il giapponese, 2 per l'inglese, 4 per il polacco, 6 per l'arabo).<string-array>per le liste statiche. PTC traduce ogni elemento preservando la struttura dell'array.- Effettua l'escape degli apostrofi (
\') e delle virgolette (\") per evitare errori di parsing XML.
Traduci strings.xml con PTC in 5 passaggi
- Inizia un progetto PTC nel tuo pannello di controllo. Carica il tuo
values/strings.xml, imposta i percorsi di output e scegli le lingue di destinazione. PTC ne supporta 40+. Durante la prova, puoi selezionarne due qualsiasi. PTC usa la lingua di origine per scegliere il motore MT giusto e per saltare le stringhe in cui l'origine è uguale alla destinazione. - Rivedi la descrizione dell'app generata automaticamente. PTC crea una breve descrizione della tua app Android dal file caricato. Modificala per descrivere meglio la tua app e il tuo pubblico. PTC usa questo contesto per abbinare il tono e il livello di formalità giusti per ogni lingua.
- Carica facoltativamente le traduzioni esistenti. Se hai già dei file
values-*/strings.xmltradotti, caricali in modo che PTC possa adattarsi al tuo stile esistente. Altrimenti, traduci da zero. - Traduci e rivedi. PTC rispetta ogni chiave
name=(le tue chiavi non cambiano mai), ogni segnaposto posizionale e genera le categorie di plurali corrette per target. Se una traduzione supera i tuoi limiti di lunghezza, PTC la evidenzia affinché nulla sfugga. Modifica qualsiasi stringa sul posto o chiedi a PTC di ritradurre tenendo a mente il vincolo. - Scarica il file
strings.xmltradotto per lingua come ZIP. Ogni file è strutturalmente identico alla tua origine. Stesse chiavi, stessi array, stessi tag plurali. Valori tradotti.
Inserisci i file strings.xml tradotti in values-{locale}/
Inserisci ogni file tradotto nella cartella values-{locale}/ corrispondente:
app/src/main/res/values-es/strings.xml # from PTC
app/src/main/res/values-fr/strings.xml # from PTC
app/src/main/res/values-de/strings.xml # from PTC
Ricompila il progetto. Android rileva le nuove risorse automaticamente. Per verificare, cambia la lingua dell'emulatore o del dispositivo e riavvia l'app. L'interfaccia utente dovrebbe apparire nella nuova lingua.
Aggiungi un selettore di lingua in-app con AppCompatDelegate.setApplicationLocales()
Molte app necessitano di un selettore di lingua in-app in modo che gli utenti possano sovrascrivere il locale del dispositivo. A partire da Android 13 (API 33), l'approccio canonico usa AppCompatDelegate.setApplicationLocales():
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.os.LocaleListCompat
fun setAppLanguage(languageTag: String) {
val locales = LocaleListCompat.forLanguageTags(languageTag)
AppCompatDelegate.setApplicationLocales(locales)
}
// Usage in a settings screen
binding.spanishButton.setOnClickListener {
setAppLanguage("es")
}
binding.frenchButton.setOnClickListener {
setAppLanguage("fr")
}
Per dichiarare quali lingue supporta la tua app (in modo che il selettore del locale di sistema le mostri), aggiungi un locales_config.xml:
<!-- res/xml/locales_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="en"/>
<locale android:name="es"/>
<locale android:name="fr"/>
<locale android:name="de"/>
<locale android:name="ja"/>
</locale-config>
E fai riferimento ad esso in AndroidManifest.xml:
<application
android:localeConfig="@xml/locales_config"
... >
Per le app con target Android 12 o inferiore, l'approccio più vecchio consiste nel salvare la scelta dell'utente in SharedPreferences e applicarla a ogni avvio dell'app:
fun setLocale(context: Context, languageCode: String) {
// Save the user's choice
val prefs = context.getSharedPreferences("Settings", Context.MODE_PRIVATE)
prefs.edit().putString("app_language", languageCode).apply()
// Apply the new locale
val locale = Locale(languageCode)
Locale.setDefault(locale)
val config = Configuration()
config.setLocale(locale)
context.resources.updateConfiguration(config, context.resources.displayMetrics)
// Restart the activity so changes take effect
if (context is Activity) {
context.recreate()
}
}
Quindi carica la lingua salvata a ogni lancio dell'app:
override fun onCreate() {
super.onCreate()
val prefs = getSharedPreferences("Settings", Context.MODE_PRIVATE)
val languageCode = prefs.getString("app_language", "en") ?: "en"
val locale = Locale(languageCode)
Locale.setDefault(locale)
val config = Configuration()
config.setLocale(locale)
resources.updateConfiguration(config, resources.displayMetrics)
}
Questo persiste tra le sessioni e funziona correttamente dopo la pubblicazione su Google Play.
Usa start/end (non left/right) per le lingue right-to-left
Per arabo, ebraico, persiano e urdu, usa start e end invece di left e right nei tuoi layout in modo che Android inverta il layout automaticamente:
<!-- Instead of this -->
<TextView android:layout_marginLeft="16dp" />
<!-- Use this -->
<TextView android:layout_marginStart="16dp" />
In Jetpack Compose, usa Arrangement.Start invece di Arrangement.Absolute.Left. Abilita «Forza direzione layout RTL» in Opzioni sviluppatore per testare l'inversione senza cambiare la lingua del dispositivo.
Automatizza la traduzione Android a ogni release con Git o l'API PTC
Per i progetti attivi, rieseguire manualmente la traduzione per ogni release non è scalabile. PTC ti offre due modi per automatizzare.
Integrazione Git (consigliata). Vai su Impostazioni > Merge Requests nel pannello di controllo PTC e fai clic su Add Git Integration per collegare il tuo repository GitHub, GitLab o Bitbucket. Fornisci un access token con permessi di lettura e scrittura e scegli i branch che PTC deve monitorare. Da lì, PTC rileva le modifiche, traduce le stringhe nuove o aggiornate e apre una merge request per la tua revisione.
API integration. Vai su Impostazioni > Gestisci token API e crea un access token. Quindi usa l'API PTC all'interno della tua CI esistente:
# .github/workflows/translate.yml
name: PTC translate
on:
push:
branches: [main]
paths:
- 'app/src/main/res/values/strings.xml'
jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Translate with PTC
run: |
cat > .ptc-config.yml <<'EOF'
source_locale: en
files:
- file: app/src/main/res/values/strings.xml
output: app/src/main/res/values-{{lang}}/strings.xml
EOF
curl -fsSL https://raw.githubusercontent.com/OnTheGoSystems/ptc-cli/main/ptc-cli.sh -o ptc-cli.sh
chmod +x ptc-cli.sh
./ptc-cli.sh --config-file .ptc-config.yml --api-token="${{ secrets.PTC_API_TOKEN }}"
Sia l'integrazione Git che l'API integration sono funzionalità Pro che diventano disponibili quando attivi il Pay-As-You-Go. Consulta la guida di riferimento dell'API PTC per endpoint, webhook e il modello di integrazione completo.
Revisione visiva della traduzione della tua app Android tradotta: rilascia senza QA manuale per lingua
Dopo che PTC traduce il tuo strings.xml, il lavoro non è finito. Un'etichetta tradotta potrebbe andare in overflow in un pulsante in tedesco. “Submit” potrebbe essere tradotto come sostantivo in francese quando l'interfaccia utente richiedeva un verbo. Una stringa inglese hardcoded che qualcuno ha dimenticato di racchiudere in getString(R.string.welcome) risulterà palesemente non tradotta nell'app Android in esecuzione. Individuare questi problemi tradizionalmente significa un ciclo di QA manuale in ogni lingua di destinazione. Questa è la fase più lenta e costosa della localizzazione mobile.
L'AI Visual QA di PTC sostituisce questo ciclo. Per le app Android native (che non vengono eseguite in un browser, quindi il flusso dell'estensione del browser non si applica), usa il caricamento delle schermate. Cattura le schermate critiche dell'app in esecuzione in ogni lingua di destinazione (impostazioni, flusso principale, casi limite) e caricale su PTC. L'IA visiva di PTC ispeziona ogni schermata e riporta i risultati:
- Problemi che PTC può correggere in
strings.xml. PTC ritraduce l'accezione del verbo, sceglie un sinonimo più corto che si adatti alla larghezza del pulsante, rigenera un plurale tenendo conto del layout. PTC apre una merge request con le correzioni. Non richiede alcun lavoro da parte tua. - Problemi che risiedono nel tuo codice Kotlin. Wrapper
getString()mancante, stringhe hardcoded, concatenazione di frasi che dovrebbe usareString.format()con i segnaposto. PTC genera un prompt pronto da incollare per Cursor o Claude Code. Il tuo team di sviluppo racchiude le stringhe in pochi secondi.
Il risultato: rilasci un'app Android multilingua e verificata a ogni release. Non ottieni un strings.xml tradotto con un lavoro residuo di QA manuale.
Traduci la tua scheda dello store del Play Store, le note di rilascio e le notifiche push
La descrizione della tua scheda dello store del Play Store, le note di rilascio delle novità e i testi delle notifiche push si trovano al di fuori di strings.xml. Lo strumento Paste to Translate di PTC gestisce questi testi nello stesso progetto. Incolla il testo di origine nel pannello di controllo PTC, scegli le lingue di destinazione, ottieni traduzioni che usano lo stesso glossario e la stessa voce del brand delle tue stringhe in-app. Quindi in Google Play Console, vai su Presenza nello Store > Scheda principale dello Store > Traduzioni, aggiungi le descrizioni brevi e lunghe tradotte e salva.
Traduci i contenuti utente in-app con l'API PTC
Le chat in-app, i post sui social e le recensioni generate dagli utenti necessitano di traduzione man mano che i contenuti arrivano. L'API REST PTC traduce questi contenuti su richiesta con autenticazione tramite token Bearer, usando lo stesso glossario e la stessa voce del brand delle tue traduzioni di strings.xml.
Testa la tua app Android localizzata a ogni release
Cambia la lingua del tuo dispositivo in Impostazioni, o usa il selettore di lingua dell'emulatore di Android Studio. Per ogni lingua, controlla che non ci sia testo troppo lungo per gli elementi dell'interfaccia utente, traduzioni mancanti (fallback silenzioso alla predefinita), formattazione errata di date/numeri/valute e problemi di layout con testo più lungo. Per le lingue RTL, abilita «Forza direzione layout RTL» in Opzioni sviluppatore.
Prezzi della traduzione Android dopo la prova
Pay-As-You-Go, nessun abbonamento. Paghi solo per ciò che traduci. Le prime 500 parole ogni mese sono gratuite e la tariffa diminuisce man mano che traduci di più. Usa il calcolatore dei prezzi per un preventivo.
Ora traduci la tua vera app Android
Inizia la tua prova di 30 giorni: 20.000 parole in 2 lingue, nessuna carta di credito. Carica il tuo strings.xml, traducilo in pochi minuti, quindi carica le schermate e lascia che PTC verifichi l'app in esecuzione.
Correlati:
- Traduci app iOS e Android con l'IA: panoramica del servizio per i team multipiattaforma.
- Come localizzare la tua app iOS: la guida equivalente per Xcode e SwiftUI.
- Guida di riferimento dell'API PTC: endpoint REST per l'integrazione CI.