Por que seu aplicativo precisa de internacionalização agora mesmo
Imagine: você criou um aplicativo Kotlin incrível — prático, rápido, com uma UI bonita. Mas todos os textos estão em russo. Um usuário de Berlim ou Tóquio abre seu produto e... fecha após 10 segundos. Por quê? Porque ele não entende nada. A internacionalização (i18n) não é apenas "traduzir botões", mas uma ponte entre seu código e milhões de usuários ao redor do mundo.
Neste artigo, vamos abordar como implementar corretamente a internacionalização Kotlin em projetos de qualquer escala: desde aplicativos Android até serviços servidores com Ktor. Você aprenderá como evitar erros comuns, como usar Kotlin Multiplatform para lógica compartilhada e por que "strings mágicas" são um problema.
Fundamentos de i18n em Kotlin: do simples ao complexo
Arquivos de recursos: a base da localização
A maneira mais confiável de organizar a localização de um aplicativo Kotlin é extrair todos os literais de string para arquivos de recursos separados. No Android Studio, são os padrões strings.xml, mas para Kotlin puro (backend, desktop) podemos usar .properties ou JSON.
Exemplo para Android:
// res/values/strings.xml (russo — padrão)
<resources>
<string name="app_name">Моё приложение</string>
<string name="welcome_message">Добро пожаловать, %s!</string>
<string name="points">У вас %d баллов</string>
</resources>
// res/values-en/strings.xml (inglês)
<resources>
<string name="app_name">My App</string>
<string name="welcome_message">Welcome, %s!</string>
<string name="points">You have %d points</string>
</resources>
No código, acessamos via context.getString():
val userName = "Алексей"
val message = context.getString(R.string.welcome_message, userName)
// Resultado: "Добро пожаловать, Алексей!" (ou "Welcome, Alexey!" em inglês)
Observe: usamos %s para strings e %d para números. Nunca concatene strings manualmente — em japonês ou árabe, a ordem das palavras pode ser diferente.
Trabalhando com formas plurais
A língua russa é famosa por suas regras complexas de declinação: 1 балл, 2 балла, 5 баллов. Em inglês é mais simples: 1 point, 2 points. A internacionalização Kotlin deve levar isso em conta.
No Android, existe <plurals> para isso:
// strings.xml
<plurals name="points_count">
<item quantity="one">%d балл</item>
<item quantity="few">%d балла</item>
<item quantity="many">%d баллов</item>
<item quantity="other">%d баллов</item>
</plurals>
// No código
val points = 3
val text = resources.getQuantityString(R.plurals.points_count, points, points)
// "3 балла"
Para Kotlin no servidor, você pode usar a biblioteca icu4j ou criar seu próprio resolvedor simples. A regra principal: nunca hardcode textos com números.
Internacionalização em Kotlin Multiplatform (KMP)
Se você está escrevendo um aplicativo multiplataforma com Kotlin Multiplatform, a tarefa se torna mais complexa. O código comum não tem acesso aos recursos do Android. A solução é usar uma interface comum e implementações específicas de plataforma.
Arquitetura para KMP
Criamos uma classe expect no módulo common:
// commonMain
expect class StringProvider {
fun getString(key: String, vararg args: Any): String
}
// Uso no código comum
class Greeting(private val strings: StringProvider) {
fun greet(name: String): String {
return strings.getString("welcome", name)
}
}
Implementação para Android: