التدويل (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_ar.properties (للغة العربية):
# messages.properties (الإنجليزية، اللغة الافتراضية)greeting=Hello, {0}!farewell=Goodbye, {0}!app.title=My Application
# messages_ar.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("ar")) 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("ar") )
// الاستخدام مع استبدال المعاملات val message = translator.translate( "greeting", "العالم" ) println(message) // مرحبًا، العالم!}المزايا: دعم صيغ الجمع (plural forms)، سياقات الترجمة، العمل على جميع منصات Kotlin.
3. النهج المتقدم: مكتبة ok-i18n
للمشاريع التي تتطلب مرونة وتكاملًا مع حاويات DI (مثل Koin أو Dagger)، فإن مكتبة ok-i18n مناسبة تمامًا. تدعم تنسيق JSON للترجمات، وهو مناسب عند العمل مع REST API أو ملفات التكوين.
مثال على ملف ترجمة JSON (ar.json)
{ "app": { "title": "تطبيقي"