Internacionalização (i18n) em Kotlin: do básico às técnicas avançadas
Internacionalização (abreviada como i18n — do inglês «internationalization», onde 18 é o número de letras entre o primeiro «i» e o último «n») — é o processo de projetar software de forma que ele possa ser facilmente adaptado para diferentes idiomas e padrões regionais sem alterações no código. Para Kotlin, como uma linguagem multiplataforma moderna, o suporte a i18n é especialmente importante, pois aplicações escritas nela rodam em Android, backend (JVM), web (Kotlin/JS) e plataformas nativas (Kotlin/Native).
Neste artigo, veremos como organizar corretamente a internacionalização em projetos Kotlin: desde abordagens básicas com arquivos de recursos até soluções avançadas com bibliotecas auxiliares.
1. Abordagem básica: arquivos de recursos (ResourceBundle)
A maneira mais simples e comum é usar os mecanismos padrão do Java ResourceBundle e arquivos de propriedades (.properties). Este método funciona muito bem para projetos JVM (Android, Spring Boot, aplicações de console).
Passo 1. Criar arquivos de localização
Crie nos recursos do projeto arquivos como messages.properties (padrão) e messages_ru.properties (para russo):
# messages.properties (inglês, idioma padrão)greeting=Hello, {0}!farewell=Goodbye, {0}!app.title=My Application
# messages_ru.properties (russo)greeting=Привет, {0}!farewell=До свидания, {0}!app.title=Моё приложениеPasso 2. Carregar e usar em Kotlin
Crie um objeto auxiliar para trabalhar com localização:
import java.text.MessageFormatimport java.util.*
object I18n { private var bundle: ResourceBundle = ResourceBundle.getBundle("messages", Locale.getDefault())
fun setLocale(locale: Locale) { bundle = ResourceBundle.getBundle("messages", locale) }
fun get(key: String, vararg args: Any?): String { val pattern = bundle.getString(key) return MessageFormat.format(pattern, *args) }}
fun main() { // Usando inglês por padrão println(I18n.get("greeting", "Alice")) // Hello, Alice!
// Mudando para russo I18n.setLocale(Locale("ru")) println(I18n.get("greeting", "Алиса")) // Привет, Алиса!}2. Biblioteca kotlin-i18n (da JetBrains)
Para Kotlin Multiplatform existe a biblioteca oficial kotlin-i18n, que permite trabalhar com traduções em todas as plataformas de forma uniforme. Ela usa o formato Gettext PO (Portable Object), que é conveniente para tradutores.
Instalação (Gradle)
repositories { mavenCentral()}dependencies { implementation("org.jetbrains.kotlinx:kotlin-i18n:0.1.0")}Exemplo de uso
import org.jetbrains.kotlinx.i18n.*
fun main() { // Criando um tradutor com carregamento de arquivos PO val translator = Translator( bundleName = "messages", locale = Locale("ru") )
// Usando com substituição de parâmetros val message = translator.translate( "greeting", "Мир" ) println(message) // Привет, Мир!}Vantagens: suporte a formas plurais, contextos de tradução, funcionamento em todas as plataformas Kotlin.
3. Abordagem avançada: biblioteca ok-i18n
Para projetos que exigem flexibilidade e integração com contêineres DI (como Koin ou Dagger), a biblioteca ok-i18n é uma excelente escolha. Ela suporta o formato JSON para traduções, o que é conveniente ao trabalhar com APIs REST ou arquivos de configuração.
Exemplo de arquivo JSON de tradução (ru.json)
{ "app": { "title": "Мо