Por qué su aplicación necesita internacionalización hoy mismo
\n\nImagine: 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\nEn 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\nFundamentos de i18n en Kotlin: de lo simple a lo complejo
\n\nArchivos de recursos: la base de la localización
\n\nLa 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.
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\nEn el código accedemos mediante context.getString():
val userName = "Alexey"\nval message = context.getString(R.string.welcome_message, userName)\n// Resultado: "¡Bienvenido, Alexey!" (o "Welcome, Alexey!" en inglés)\n\nTenga 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.
Trabajo con formas plurales (número plural)
\n\nEl 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\nEn Android, para esto existe <plurals>:
// 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\nPara Kotlin de servidor, puede usar la biblioteca icu4j o escribir su propio resolver simple. La regla principal: nunca codifique textos con números.
Internacionalización en Kotlin Multiplatform (KMP)
\n\nSi 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\nArquitectura para KMP
\n\nCreamos 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\nImplementación para Android:
\n\n