Kotlin में अंतर्राष्ट्रीयकरण (i18n): उदाहरणों के साथ पूर्ण गाइड
अंतर्राष्ट्रीयकरण (i18n) सॉफ्टवेयर को डिज़ाइन और डेवलप करने की प्रक्रिया है, जिससे बिना सोर्स कोड बदले इसे विभिन्न भाषाओं और क्षेत्रों के लिए अनुकूलित किया जा सके। Kotlin इकोसिस्टम में - चाहे वह Android ऐप हो, Ktor पर सर्वर प्रोजेक्ट हो, या Kotlin Multiplatform के साथ मल्टीप्लेटफॉर्म समाधान - i18n का सही कार्यान्वयन उत्पाद की वैश्विक सफलता के लिए महत्वपूर्ण है। इस लेख में, हम Kotlin ऐप के अंतर्राष्ट्रीयकरण के मुख्य दृष्टिकोण, टूल्स और सर्वोत्तम प्रथाओं पर चर्चा करेंगे।
Kotlin में i18n क्यों महत्वपूर्ण है?
Kotlin, Java के साथ पूरी तरह से संगत एक आधुनिक भाषा होने के नाते, लोकलाइज़ेशन के लिए Java की सभी क्षमताओं को विरासत में लेती है, साथ ही अपने अनूठे समाधान भी प्रदान करती है। सही अंतर्राष्ट्रीयकरण आपको यह सक्षम बनाता है:
- अपने ऐप के दर्शकों को काफी हद तक बढ़ाना
- विभिन्न भाषाओं के उपयोगकर्ताओं के लिए अनुभव बेहतर बनाना
- विभिन्न देशों की कानूनी आवश्यकताओं का पालन करना (जैसे मुद्रा या दिनांक प्रारूप)
- भविष्य में नई भाषाएँ जोड़ने की प्रक्रिया को सरल बनाना
Kotlin में i18n के मुख्य दृष्टिकोण
1. Resource Bundle का उपयोग (Java-संगत दृष्टिकोण)
सबसे सामान्य और सरल तरीका मानक ResourceBundle और प्रॉपर्टी फ़ाइलों (.properties) का उपयोग करना है। यह विधि कंसोल ऐप और Kotlin पर सर्वर प्रोजेक्ट के लिए आदर्श है।
// messages_en.properties
greeting=Hello, {0}!
farewell=Goodbye
// messages_hi.properties
greeting=नमस्ते, {0}!
farewell=अलविदा
import java.util.ResourceBundle
import java.text.MessageFormat
fun main() {
val bundle = ResourceBundle.getBundle("messages", Locale("hi"))
val greeting = MessageFormat.format(bundle.getString("greeting"), "दुनिया")
println(greeting) // आउटपुट: नमस्ते, दुनिया!
println(bundle.getString("farewell")) // आउटपुट: अलविदा
}
2. Kotlin-विशिष्ट दृष्टिकोण: एक्सटेंशन फंक्शन्स के साथ
Kotlin आपको एक्सटेंशन फंक्शन्स और डेलिगेटेड प्रॉपर्टीज का उपयोग करके लोकलाइज़ेशन के लिए अधिक संक्षिप्त और सुरक्षित API बनाने की अनुमति देता है।
import java.util.*
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
class I18n(private val baseName: String) {
private val bundle: ResourceBundle
get() = ResourceBundle.getBundle(baseName)
operator fun provideDelegate(
thisRef: Any?,
prop: KProperty<*>
): ReadOnlyProperty {
return ReadOnlyProperty { _, _ -> bundle.getString(prop.name) }
}
}
object Strings {
val i18n = I18n("messages")
val greeting by i18n
val farewell by i18n
}
fun main() {
// स्वचालित रूप से सिस्टम की लोकल का उपयोग करता है
println(Strings.greeting) // प्रॉपर्टी फ़ाइल से संबंधित मान प्रिंट करेगा
println(Strings.farewell)
}
Kotlin में लोकलाइज़ेशन के लिए टूल्स
1. Kotlin Multiplatform (KMP) और expect/actual
मल्टीप्लेटफॉर्म प्रोजेक्ट के लिए, Kotlin एक शक्तिशाली expect/actual तंत्र प्रदान करता है, जो i18n के लिए सामान्य API घोषित करने और इसे प्रत्येक प्लेटफॉर्म के लिए अलग-अलग लागू करने की अनुमति देता है।
// सामान्य कोड में (commonMain)
expect class PlatformStringResources {
fun getString(key: String, vararg args: Any?): String
}
// Android में (androidMain)
actual class PlatformStringResources {
private val context: Context = // कॉन्टेक्स्ट प्राप्त करें
actual fun getString(key: String, vararg args: Any?): String {
val resId = context.resources.getIdentifier(key, "string", context.packageName)
return context.getString(resId, *args)
}
}
// iOS में (iosMain)
actual class PlatformStringResources {
actual fun getString(key: String, vararg args: Any?): String {
return NSString.localizedStringWithFormat(
NSLocalizedString(key, comment: "")
)
}
}