Kotlin 中的国际化 (i18n):从基础到高级技术
国际化(缩写为 i18n——来自英文“internationalization”,其中 18 是第一个字母“i”和最后一个字母“n”之间的字母数)是一种软件设计过程,旨在使软件能够轻松适应不同的语言和区域标准,而无需修改代码。对于 Kotlin 这种现代多平台语言来说,i18n 支持尤为重要,因为基于 Kotlin 的应用程序运行在 Android、后端 (JVM)、Web (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) // Привет, Мир!}优点:支持复数形式、翻译上下文,可在所有 Kotlin 平台上运行。
3. 高级方法:ok-i18n 库
对于需要灵活性以及与 DI 容器(例如 Koin 或 Dagger)集成的项目,ok-i18n 库非常合适。它支持 JSON 格式的翻译,这在处理 REST API 或配置文件时很方便。
JSON 翻译文件示例 (ru.json)
{ "app": { "title": "Мо