تدويل تطبيقات Kotlin: كيف لا تتوه بين اللغات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا يحتاج تطبيقك إلى التدويل اليوم

تخيل: لقد كتبت تطبيق Kotlin رائع - سهل الاستخدام، سريع، بواجهة مستخدم جميلة. لكن كل النصوص فيه بالروسية. مستخدم من برلين أو طوكيو يفتح منتجك... ويغلقه بعد 10 ثوانٍ. لماذا؟ لأنه لا يفهم كلمة واحدة. التدويل (i18n) ليس مجرد "ترجمة الأزرار"، بل هو جسر بين كودك وملايين المستخدمين حول العالم.

في هذه المقالة، سنشرح كيفية تنفيذ تدويل Kotlin بكفاءة في مشاريع من أي حجم: من تطبيقات Android إلى خدمات الخوادم على Ktor. ستتعلم كيفية تجنب الأخطاء الشائعة، وكيفية استخدام Kotlin Multiplatform للمنطق المشترك، ولماذا "السلاسل السحرية" شريرة.

أساسيات i18n في Kotlin: من البسيط إلى المعقد

ملفات الموارد: أساس التوطين

الطريقة الأكثر موثوقية لتنظيم توطين تطبيق Kotlin هي إخراج جميع القيم النصية إلى ملفات موارد منفصلة. في Android Studio، هذه هي ملفات strings.xml القياسية، لكن لـ Kotlin النقي (الخلفية، سطح المكتب) يمكننا استخدام .properties أو JSON.

مثال لنظام Android:

// res/values/strings.xml (الروسية - الافتراضي)
<resources>
    <string name="app_name">تطبيقي</string>
    <string name="welcome_message">مرحبًا، %s!</string>
    <string name="points">لديك %d نقطة</string>
</resources>

// res/values-en/strings.xml (الإنجليزية)
<resources>
    <string name="app_name">My App</string>
    <string name="welcome_message">Welcome, %s!</string>
    <string name="points">You have %d points</string>
</resources>

في الكود، نستخدم context.getString():

val userName = "أليكسي"
val message = context.getString(R.string.welcome_message, userName)
// النتيجة: "مرحبًا، أليكسي!" (أو "Welcome, Alexey!" بالإنجليزية)

لاحظ: نستخدم %s للسلاسل النصية و %d للأرقام. لا تقم أبدًا بدمج السلاسل يدويًا - في اليابانية أو العربية، قد يختلف ترتيب الكلمات.

العمل مع صيغ الجمع (الأعداد المتعددة)

تشتهر اللغة الروسية بقواعد التصريف المعقدة: 1 балл، 2 балла، 5 баллов. في الإنجليزية الأمر أبسط: 1 point, 2 points. تدويل Kotlin يجب أن يأخذ هذا في الاعتبار.

في Android، لهذا نستخدم <plurals>:

// strings.xml
<plurals name="points_count">
    <item quantity="one">%d نقطة</item>
    <item quantity="few">%d نقطتين</item>
    <item quantity="many">%d نقاط</item>
    <item quantity="other">%d نقطة</item>
</plurals>

// في الكود
val points = 3
val text = resources.getQuantityString(R.plurals.points_count, points, points)
// "3 نقاط"

بالنسبة لـ Kotlin على الخادم، يمكن استخدام مكتبة icu4j أو كتابة محلل بسيط خاص بك. القاعدة الأساسية: لا تقم أبدًا بتضمين النصوص مع الأرقام بشكل ثابت في الكود.

التدويل في Kotlin Multiplatform (KMP)

إذا كنت تكتب تطبيقًا عبر المنصات باستخدام Kotlin Multiplatform، تصبح المهمة أكثر تعقيدًا. الكود المشترك لا يمكنه الوصول إلى موارد Android. الحل هو استخدام واجهة مشتركة وتنفيذات خاصة بالمنصة.

الهندسة المعمارية لـ KMP

ننشئ فئة expect في الوحدة المشتركة:

// commonMain
expect class StringProvider {
    fun getString(key: String, vararg args: Any): String
}

// الاستخدام في الكود المشترك
class Greeting(private val strings: StringProvider) {
    fun greet(name: String): String {
        return strings.getString("welcome", name)
    }
}

التنفيذ لنظام Android:

المدونات

توصيات الكتب