PTC

Cómo localizar su app de Android con IA

Configure las carpetas values/, traduzca strings.xml con IA, cambie de idioma en Kotlin y, a continuación, suba capturas de pantalla para que PTC (Private Translation Cloud) revise la app de Android en ejecución. Al finalizar esta guía tendrá una app de Android multilingüe lista para publicar, con cada idioma de destino verificado mediante revisión visual antes del lanzamiento.

Esta guía da por hecho que ya tiene un proyecto de Android existente en Android Studio. Si empieza desde cero, primero cree un nuevo proyecto con la plantilla «Empty Activity».

Cómo resuelve Android los recursos localizados desde las carpetas values-{locale}/

Android organiza los recursos localizados en carpetas res/values-{locale}/ dentro de app/src/main/. La carpeta predeterminada es values/, que contiene los strings del idioma de origen. Cada idioma de destino obtiene su propia carpeta 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)

Incluya siempre la carpeta predeterminada values/ sin código de idioma. Ese es su recurso de reserva. Android elige la carpeta correcta en tiempo de ejecución según la configuración regional del dispositivo del usuario. Si el idioma del usuario es el español pero no tiene values-es/, Android recurre a values/. La reserva se aplica de forma silenciosa. Una app traducida parcialmente muestra inglés mezclado con español, sin que aparezca ningún error.

Los códigos de configuración regional siguen BCP 47. es para español, pt-rBR para portugués de Brasil (observe el prefijo r de la región), zh-rCN para chino simplificado.

Mueva cada string visible para el usuario a strings.xml

Use siempre recursos de string almacenados en strings.xml. Nunca escriba el texto directamente en el código de Kotlin/Java ni en un atributo de diseño android:text=. El texto codificado de forma fija no se puede traducir.

Mueva cada string visible para el usuario a 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>

Haga referencia a cada string en Kotlin mediante el ID R.string.* generado:

val welcomeText = stringResource(R.string.welcome_text)
val welcome = stringResource(R.string.welcome_user, userName)
val summary = stringResource(R.string.points_summary, userName, points)

Convenciones clave que PTC respeta:

  • Marcadores de posición posicionales. Use %1$s, %2$d, %3$f en lugar de %s, %d. Algunos idiomas necesitan reordenar los argumentos. Los marcadores de posición posicionales lo hacen posible. PTC los reconoce y los conserva automáticamente.
  • <plurals> para sustantivos contables. No escriba if (count == 1) "1 note" else "$count notes" en el código. Use <plurals> con las cantidades one / other / few / many. PTC genera las categorías de plural correctas para cada idioma de destino (1 forma para el japonés, 2 para el inglés, 3 para el polaco, 6 para el árabe).
  • <string-array> para listas estáticas. PTC traduce cada elemento conservando la estructura del array.
  • Escape los apóstrofos (\') y las comillas (\") para evitar errores de análisis de XML.

Traduzca strings.xml con PTC en 5 pasos

  1. Inicie un proyecto de PTC en su panel de control. Suba su values/strings.xml, defina sus rutas de salida y elija los idiomas de destino. PTC admite más de 40. Durante la prueba gratuita, puede seleccionar dos cualesquiera. PTC usa el idioma de origen para elegir el motor de MT adecuado y omitir los strings en los que el origen coincide con el destino.
  2. Revise la descripción de la app generada automáticamente. PTC crea una breve descripción de su app de Android a partir del archivo subido. Edítela para describir mejor su app y su audiencia. PTC utiliza este contexto para acertar con el tono y la formalidad adecuados para cada idioma.
  3. Suba opcionalmente las traducciones existentes. Si ya tiene archivos values-*/strings.xml traducidos, súbalos para que PTC pueda adaptarse a su estilo actual. De lo contrario, se traduce desde cero.
  4. Traduzca y revise. PTC respeta cada clave name= (sus claves nunca cambian), cada marcador de posición posicional y genera las categorías de plural correctas para cada destino. Si una traducción supera sus límites de longitud, PTC la resalta para que no se escape nada. Edite cualquier string directamente o pida a PTC que la vuelva a traducir teniendo en cuenta la restricción.
  5. Descargue la strings.xml traducida para cada idioma como un ZIP. Cada archivo es estructuralmente idéntico a su origen. Las mismas claves, los mismos arrays, las mismas etiquetas de plural. Valores traducidos.

Coloque los archivos strings.xml traducidos en values-{locale}/

Coloque cada archivo traducido en la carpeta values-{locale}/ correspondiente:

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

Vuelva a compilar el proyecto. Android adopta los nuevos recursos automáticamente. Para verificarlo, cambie el idioma de su emulador o dispositivo y vuelva a iniciar la app. La interfaz debería aparecer en el nuevo idioma.

Añada un selector de idioma dentro de la app con AppCompatDelegate.setApplicationLocales()

Muchas apps necesitan un selector de idioma dentro de la app para que los usuarios puedan anular la configuración regional del dispositivo. Desde Android 13 (API 33), el enfoque canónico 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")
}

Para declarar qué idiomas admite su app (de modo que el selector de idioma del sistema los muestre), añada 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>

Y haga referencia a él en AndroidManifest.xml:

<application
    android:localeConfig="@xml/locales_config"
    ... >

Para apps dirigidas a Android 12 o anterior, el enfoque más antiguo consiste en guardar la elección del usuario en SharedPreferences y aplicarla en cada inicio de la 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()
    }
}

Después, cargue el idioma guardado en cada inicio de la 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)
}

Esto se conserva entre sesiones y funciona correctamente después de publicar en Google Play.

Use start/end (no left/right) para los idiomas de derecha a izquierda

Para el árabe, el hebreo, el persa y el urdu, use start y end en lugar de left y right en sus diseños para que Android refleje el diseño automáticamente:

<!-- Instead of this -->
<TextView android:layout_marginLeft="16dp" />

<!-- Use this -->
<TextView android:layout_marginStart="16dp" />

En Jetpack Compose, use Arrangement.Start en lugar de Arrangement.Absolute.Left. Active «Force RTL layout direction» en las Opciones de desarrollador para probar el reflejo sin cambiar el idioma del dispositivo.

Automatice la traducción de Android en cada lanzamiento con Git o con la API de PTC

En los proyectos activos, volver a ejecutar manualmente la traducción en cada lanzamiento no es escalable. PTC le ofrece dos formas de automatizarlo.

Integración con Git (recomendada). Vaya a Settings > Merge Requests en el panel de PTC y haga clic en Add Git Integration para conectar su repositorio de GitHub, GitLab o Bitbucket. Proporcione un token de acceso con permisos de lectura y escritura y elija las ramas que PTC debe supervisar. A partir de ahí, PTC detecta los cambios, traduce los strings nuevos o actualizados y abre un merge request para que usted lo revise.

Integración con la API. Vaya a Settings > Manage API Tokens y cree un token de acceso. A continuación, use la API de PTC dentro de su CI existente:

# .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: Trigger PTC translation
        run: |
          curl -X POST https://api.ptc.wpml.org/v1/projects/${{ secrets.PTC_PROJECT_ID }}/sync \
            -H "Authorization: Bearer ${{ secrets.PTC_API_KEY }}"

Tanto la integración con Git como con la API son funciones Pro que pasan a estar disponibles cuando activa Pay-As-You-Go. Consulte la PTC API reference para conocer los endpoints, los webhooks y el modelo de integración completo.

Revisión visual de la traducción de su app de Android traducida - publique sin QA manual por idioma

Después de que PTC traduzca su strings.xml, el trabajo no termina. Una etiqueta traducida puede desbordar un botón en alemán. «Submit» puede traducirse como sustantivo en francés cuando la interfaz necesitaba un verbo. Un string en inglés codificado de forma fija que alguien olvidó envolver en getString(R.string.welcome) quedará claramente sin traducir en la app de Android en ejecución. Detectar estos problemas tradicionalmente implica una pasada de QA manual en cada idioma de destino. La fase más lenta y costosa de la localización móvil.

La revisión visual con IA de PTC sustituye esa pasada. Para las apps nativas de Android (que no se ejecutan en un navegador, por lo que el flujo de la extensión no se aplica), use la carga de capturas de pantalla. Capture las pantallas críticas de la app en ejecución en cada idioma de destino (ajustes, flujo principal, casos límite) y súbalas a PTC. La IA de visión de PTC inspecciona cada pantalla e informa:

  • Problemas que PTC puede corregir en strings.xml. PTC vuelve a traducir el sentido del verbo, elige un sinónimo más corto que cabe en el ancho del botón, regenera un plural adaptado al diseño. PTC abre un PR con las correcciones. Sin trabajo para usted.
  • Problemas que residen en su código de Kotlin. Falta del envoltorio getString(), strings codificados de forma fija, concatenación de frases que debería usar String.format() con marcadores de posición. PTC genera un prompt listo para pegar en Cursor o Claude Code. Su equipo de desarrollo envuelve los strings en segundos.

El resultado: publica una app de Android multilingüe y verificada en cada lanzamiento. No una strings.xml traducida con una cola de QA manual.

Traduzca la ficha de Play Store, las notas de la versión y las notificaciones push

La descripción de su ficha de Play Store, las notas de la versión con las novedades y el texto de sus notificaciones push residen fuera de strings.xml. La función Paste to Translate de PTC gestiona ese texto en el mismo proyecto. Pegue el texto de origen en el panel de PTC, elija los idiomas de destino y obtenga traducciones que usan el mismo glosario y la misma voz de marca que sus strings dentro de la app. Después, en Google Play Console, vaya a Store Presence > Main Store Listing > Translations, añada las descripciones cortas y largas traducidas y guarde.

Traduzca el contenido de usuario dentro de la app con la API de PTC

El chat dentro de la app, las publicaciones sociales y las reseñas generadas por los usuarios necesitan traducirse a medida que llega el contenido. La PTC REST API traduce este contenido bajo demanda con autenticación por token Bearer, usando el mismo glosario y la misma voz de marca que sus traducciones de strings.xml.

Pruebe su app de Android localizada en cada lanzamiento

Cambie el idioma de su dispositivo en Ajustes o use el selector de idioma del emulador de Android Studio. Para cada idioma, compruebe si hay texto demasiado largo para los elementos de la interfaz, traducciones que faltan (reserva silenciosa al valor predeterminado), formato incorrecto de fechas, números o monedas y problemas de diseño con texto más largo. Para los idiomas RTL, active «Force RTL layout direction» en las Opciones de desarrollador.

Precios de la traducción de Android después de la prueba gratuita

Pay-As-You-Go, sin suscripción. Solo paga por lo que traduce. Las primeras 500 palabras de cada mes son gratuitas, y la tarifa baja a medida que traduce más. Use la pricing calculator para obtener una estimación.

Ahora traduzca su app de Android real

Comience su prueba gratuita de 30 días - 20.000 palabras en 2 idiomas, sin tarjeta de crédito. Suba su strings.xml, tradúzcala en minutos y, a continuación, suba capturas de pantalla y deje que PTC verifique la app en ejecución.

Relacionado: