لماذا يحتاج تطبيق Go الخاص بك إلى التدويل (i18n)؟
\n\nلقد كتبت خدمة رائعة بلغة Go. إنها سريعة، متزامنة، وتُترجم في ثوانٍ. لكن هناك مشكلة واحدة: جميع الرسائل والأزرار والتلميحات فيها باللغة الروسية (أو الإنجليزية). والعالم يريد استخدام منتجك بلغته الأم. وهنا يأتي دور تدويل تطبيقات Go (i18n).
\n\nيعتقد الكثيرون أن ترجمة Go هي كابوس مع ملفات JSON والحلول المؤقتة. لكن هذا ليس صحيحًا. تقدم بيئة Go حلولًا أنيقة تتيح إضافة دعم لأي عدد من اللغات، دون تضخيم الكود أو فقدان الأداء. في هذه المقالة، سنشرح كيفية تنفيذ i18n في Go بشكل صحيح، ليتحدث تطبيقك بمئات اللغات.
\n\nما هو i18n و l10n؟ فهم المصطلحات
\n\nقبل كتابة الكود، دعنا نرتب المصطلحات:
\n\n- \n
- i18n (التدويل) — عملية تصميم التطبيق بحيث يمكن تكييفه مع لغات ومناطق مختلفة دون إعادة كتابة الكود. يتعلق الأمر بالهندسة. \n
- l10n (الترجمة) — تكييف المحتوى (ترجمة النص، تنسيق التواريخ، العملات) مع لغة محددة (مثل en-US، ru-RU، de-DE). \n
في سياق تدويل تطبيقات Go، i18n هو إعداد الكود (استخدام المفاتيح بدلاً من السلاسل النصية)، بينما l10n هو ملء هذه المفاتيح بالترجمات.
\n\nاختيار المكتبة: لماذا go-i18n؟
\n\nتوجد في Go عدة مكتبات شائعة للعمل مع الترجمات. بعد اختبار خيارات مختلفة، فإن أفضل خيار لمعظم المشاريع هو go-i18n من nicksnyder. لماذا؟
\n\n- \n
- سهولة الاستخدام — الحد الأدنى من الكود التمهيدي. \n
- دعم الجمع — التصريف الصحيح لـ "رسالة واحدة"، "رسالتان"، "5 رسائل". \n
- العمل مع TOML/YAML/JSON — اختر تنسيق الترجمات الذي تفضله. \n
- دعم القوالب — يمكنك إدراج المتغيرات مباشرة في سلسلة الترجمة. \n
- أداة مدمجة لاستخراج المفاتيح — لا حاجة لكتابة الترجمات يدويًا. \n
مثال عملي: إنشاء خدمة متعددة اللغات بلغة Go
\n\nلنقم بإنشاء خادم ويب بسيط بلغة Go يرحب بالمستخدم بلغته.
\n\nالخطوة 1: التثبيت وهيكل المشروع
\n\nقم بتثبيت المكتبة وإنشاء هيكل الدليل:
\n\ngo get github.com/nicksnyder/go-i18n/v2/i18n\ngo get golang.org/x/text/language\n\nهيكل المشروع:
\n\nmyapp/\n├── main.go\n└── locales/\n ├── active.en.toml\n ├── active.ru.toml\n └── active.de.toml\n\nالخطوة 2: إنشاء ملفات الترجمة
\n\nlocales/active.en.toml:
\n\n[greeting]\ndescription = "تحية المستخدم"\none = "مرحبًا، {{.Name}}!"\nother = "مرحبًا، {{.Name}}!"\n\n[inbox]\ndescription = "عدد الرسائل في صندوق الوارد"\none = "لديك {{.Count}} رسالة جديدة."\nother = "لديك {{.Count}} رسائل جديدة."\n\nlocales/active.ru.toml:
\n\n[greeting]\ndescription = "تحية المستخدم"\none = "Привет, {{.Name}}!"\nother = "Привет, {{.Name}}!"\n\n[inbox]\ndescription = "عدد الرسائل في صندوق الوارد"\none = "У вас {{.Count}} новое сообщение."\nfew = "У вас {{.Count}} новых сообщения."\nmany = "У вас {{.Count}} новых сообщений."\nother = "У вас {{.Count}} сообщений."\n\nلاحظ صيغ الجمع في اللغة الروسية: one, few, many, other. الجمع في Go هي ميزة قوية تعالج قواعد التصريف المعقدة بشكل صحيح.
\n\nالخطوة 3: كتابة الكود بلغة Go
\n\nالآن الجزء الممتع — التدويل