Интернационализация (i18n) в Kotlin: от основ до продвинутых техник
Интернационализация (сокращённо i18n — от английского "internationalization", где 18 — количество букв между первым "i" и последним "n") — это процесс проектирования программного обеспечения таким образом, чтобы его можно было легко адаптировать к различным языкам и региональным стандартам без изменения кода. Для Kotlin, как современного мультиплатформенного языка, поддержка i18n особенно важна, поскольку приложения на нём работают на Android, бэкенде (JVM), вебе (Kotlin/JS) и нативных платформах (Kotlin/Native).
В этой статье мы рассмотрим, как эффективно организовать интернационализацию в проектах на Kotlin: от базовых подходов с использованием файлов ресурсов до продвинутых решений со вспомогательными библиотеками.
1. Базовый подход: файлы ресурсов (ResourceBundle)
Самый простой и распространённый способ — использование стандартного механизма Java ResourceBundle и файлов свойств (.properties). Этот метод отлично работает для проектов на JVM (Android, Spring Boot, консольные приложения).
Шаг 1. Создайте файлы локализации
В ресурсах проекта создайте файлы messages.properties (по умолчанию) и messages_ru.properties (для русского языка):
# messages.properties (английский, по умолчанию)greeting=Hello, {0}!farewell=Goodbye, {0}!app.title=My Application
# messages_ru.properties (русский)greeting=Привет, {0}!farewell=До свидания, {0}!app.title=Моё приложениеШаг 2. Загрузка и использование в Kotlin
Создайте вспомогательный объект для работы с локализацией:
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() { // По умолчанию используем английский println(I18n.get("greeting", "Alice")) // Hello, Alice!
// Переключаемся на русский I18n.setLocale(Locale("ru")) println(I18n.get("greeting", "Алиса")) // Привет, Алиса!}2. Библиотека kotlin-i18n (от JetBrains)
Для Kotlin Multiplatform существует официальная библиотека kotlin-i18n, которая позволяет работать с переводами единообразно на всех платформах. Она использует формат Gettext PO (Portable Object), удобный для переводчиков.
Установка (Gradle)
repositories { mavenCentral()}dependencies { implementation("org.jetbrains.kotlinx:kotlin-i18n:0.1.0")}Пример использования
import org.jetbrains.kotlinx.i18n.*
fun main() { // Создаём переводчик, загружающий PO-файлы val translator = Translator( bundleName = "messages", locale = Locale("ru") )
// Используем с подстановкой параметров val message = translator.translate( "greeting", "Мир" ) println(message) // Привет, Мир!}Преимущества: поддержка множественных форм (plural forms), контекстов переводов, работа на всех платформах Kotlin.
3. Продвинутый подход: библиотека ok-i18n
Для проектов, где нужна гибкость и интеграция с DI-контейнерами (например, Koin или Dagger), отлично подходит библиотека ok-i18n. Она поддерживает формат JSON для переводов, что удобно при работе с REST API или конфигурационными файлами.
Пример файла переводов JSON (ru.json)
{ "app": { "title": "Мо