Internacionalización de aplicaciones Kotlin: cómo no confundirse con los idiomas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué su aplicación necesita internacionalización hoy mismo

\n\n

Imagine: ha creado una aplicación Kotlin increíble: cómoda, rápida, con una UI bonita. Pero todos los textos están en ruso. Un usuario de Berlín o Tokio abre su producto y... lo cierra a los 10 segundos. ¿Por qué? Porque no entiende ni una palabra. La internacionalización (i18n) no es solo "traducir botones", sino un puente entre su código y millones de usuarios en todo el mundo.

\n\n

En este artículo, veremos cómo implementar correctamente la internacionalización de Kotlin en proyectos de cualquier escala: desde aplicaciones Android hasta servicios de servidor con Ktor. Aprenderá cómo evitar errores típicos, cómo usar Kotlin Multiplatform para la lógica común y por qué las "cadenas mágicas" son malas.

\n\n

Fundamentos de i18n en Kotlin: de lo simple a lo complejo

\n\n

Archivos de recursos: la base de la localización

\n\n

La forma más confiable de organizar la localización de una aplicación Kotlin es extraer todos los literales de cadena en archivos de recursos separados. En Android Studio, son los estándar strings.xml, pero para Kotlin puro (backend, desktop) podemos usar .properties o JSON.

\n\n

Ejemplo para Android:

\n\n
// res/values/strings.xml (ruso — por defecto)\n<resources>\n    <string name="app_name">Mi aplicación</string>\n    <string name="welcome_message">¡Bienvenido, %s!</string>\n    <string name="points">Tienes %d puntos</string>\n</resources>\n\n// res/values-en/strings.xml (inglés)\n<resources>\n    <string name="app_name">My App</string>\n    <string name="welcome_message">Welcome, %s!</string>\n    <string name="points">You have %d points</string>\n</resources>
\n\n

En el código accedemos mediante context.getString():

\n\n
val userName = "Alexey"\nval message = context.getString(R.string.welcome_message, userName)\n// Resultado: "¡Bienvenido, Alexey!" (o "Welcome, Alexey!" en inglés)
\n\n

Tenga en cuenta: usamos %s para cadenas y %d para números. Nunca concatene cadenas manualmente: en japonés o árabe, el orden de las palabras puede ser diferente.

\n\n

Trabajo con formas plurales (número plural)

\n\n

El idioma ruso es famoso por sus complejas reglas de declinación: 1 punto, 2 puntos, 5 puntos. En inglés es más simple: 1 point, 2 points. La internacionalización de Kotlin debe tener esto en cuenta.

\n\n

En Android, para esto existe <plurals>:

\n\n
// strings.xml\n<plurals name="points_count">\n    <item quantity="one">%d punto</item>\n    <item quantity="few">%d puntos</item>\n    <item quantity="many">%d puntos</item>\n    <item quantity="other">%d puntos</item>\n</plurals>\n\n// En el código\nval points = 3\nval text = resources.getQuantityString(R.plurals.points_count, points, points)\n// "3 puntos"
\n\n

Para Kotlin de servidor, puede usar la biblioteca icu4j o escribir su propio resolver simple. La regla principal: nunca codifique textos con números.

\n\n

Internacionalización en Kotlin Multiplatform (KMP)

\n\n

Si está escribiendo una aplicación multiplataforma en Kotlin Multiplatform, la tarea se vuelve más compleja. El código común no tiene acceso a los recursos de Android. La solución es usar una interfaz común e implementaciones específicas de la plataforma.

\n\n

Arquitectura para KMP

\n\n

Creamos una clase expect en el módulo common:

\n\n
// commonMain\nexpect class StringProvider {\n    fun getString(key: String, vararg args: Any): String\n}\n\n// Uso en el código común\nclass Greeting(private val strings: StringProvider) {\n    fun greet(name: String): String {\n        return strings.getString("welcome", name)\n    }\n}
\n\n

Implementación para Android:

\n\n

Blogs

Book Recommendations