التدويل (i18n) في Java: دليل شامل
\n\nالتدويل (اختصارًا i18n - من كلمة internationalization، حيث يوجد بين الحرف الأول 'i' والحرف الأخير 'n' 18 حرفًا) هو عملية تصميم البرمجيات بحيث يمكن تكييفها مع لغات ومناطق مختلفة دون إجراء تغييرات في الكود المصدري. توفر Java مجموعة أدوات مدمجة وقوية للتدويل، مما يسمح للمطورين بإنشاء تطبيقات متعددة اللغات بسهولة.
\n\nفي هذه المقالة، سنشرح بالتفصيل المكونات الرئيسية لـ i18n في Java: Locale و ResourceBundle وملفات الخصائص و MessageFormat. ستتعلم كيفية هيكلة الموارد المترجمة بشكل صحيح ومعالجة الاستثناءات المتعلقة بعدم وجود ترجمة.
1. المكونات الرئيسية لـ i18n في Java
\n\nيعتمد التدويل في Java على ثلاثة عناصر أساسية:
\n\n- \n
- Locale - كائن يمثل منطقة جغرافية أو سياسية أو ثقافية محددة. يحتوي على معلومات حول اللغة والبلد (اختياري) والتنوع (اختياري). \n
- ResourceBundle - فئة تقوم بتحميل الموارد المترجمة (سلاسل نصية، تنسيقات) من ملفات الخصائص (
.properties) أو مصادر أخرى. \n - ملفات الخصائص - ملفات نصية بامتداد
.properties، حيث يتم تخزين أزواجمفتاح=قيمة. يتم بناء اسم الملف وفقًا للقواعد:الاسم_الأساسي_اللغة_البلد.properties. \n
مثال على هيكل الملفات للغتين الروسية والإنجليزية:
\n\nMessages.properties // الملف الافتراضي\nMessages_en.properties // الإنجليزية (عام)\nMessages_en_US.properties // الإنجليزية (الولايات المتحدة)\nMessages_ru_RU.properties // الروسية (روسيا)\n\n\n2. إنشاء ملفات الخصائص
\n\nلنقم بإنشاء ملف أساسي Messages.properties (القيم الافتراضية - بالإنجليزية):
greeting=Hello\nfarewell=Goodbye\napp.name=My Application\n\n\nالآن لنقم بإنشاء الترجمة الروسية Messages_ru_RU.properties:
greeting=Здравствуйте\nfarewell=До свидания\napp.name=Моё приложение\n\n\nللإنجليزية (الولايات المتحدة) - Messages_en_US.properties:
greeting=Hello\nfarewell=Goodbye\napp.name=My Application\n\n\n3. استخدام Locale و ResourceBundle
\n\nلتحميل السلاسل المترجمة، يتم استخدام الكود التالي:
\n\nimport java.util.Locale;\nimport java.util.ResourceBundle;\n\npublic class I18nExample {\n public static void main(String[] args) {\n // تعيين اللغة المحلية (مثال: اللغة الروسية، روسيا)\n Locale ruLocale = new Locale("ru", "RU");\n ResourceBundle bundle = ResourceBundle.getBundle("Messages", ruLocale);\n \n // الحصول على السلاسل المترجمة\n String greeting = bundle.getString("greeting");\n String farewell = bundle.getString("farewell");\n String appName = bundle.getString("app.name");\n \n System.out.println(greeting + " " + farewell); // Здравствуйте До свидания\n System.out.println(appName); // Моё приложение\n }\n}\n\n\nإذا لم يتم العثور على اللغة المحلية، تستخدم Java تلقائيًا سلسلة البحث:
\n- \n
- أولاً، يبحث عن ملف بالتطابق التام (
Messages_ru_RU.properties). \n - ثم - بدون البلد (
Messages_ru.properties). \n - بعد ذلك - الملف الأساسي (
Messages.properties). \n - إذا لم يتم العثور على شيء - يتم طرح استثناء
MissingResourceException. \n
4. تنسيق الرسائل باستخدام MessageFormat
\n\nغالبًا ما تحتوي السلاسل على أجزاء متغيرة. لهذا، يتم استخدام MessageFormat. مثال مع بيانات ديناميكية: