التدويل (i18n) في Go (Golang): دليل شامل للمطورين
التدويل (i18n) هو عملية تصميم البرمجيات بحيث يمكن تكييفها بسهولة مع لغات ومناطق مختلفة دون إجراء تغييرات على الكود المصدري. في Go (Golang)، توجد عدة حلول ناضجة لهذا الغرض، ولكن الأكثر شيوعًا وتوحيدًا هو الحزمة golang.org/x/text التي توفر أدوات قوية للعمل مع الترجمة. في هذه المقالة، سنشرح بالتفصيل كيفية إعداد i18n في تطبيق Go باستخدام المكتبات الرسمية وأفضل الممارسات.
المكتبات الأساسية لـ i18n في Go
يقدم نظام Go البيئي عدة طرق للتدويل. دعنا نستعرض أهمها:
golang.org/x/text— الحزمة الرئيسية من فريق Go، تدعم Unicode و CLDR (مستودع بيانات الإعدادات المحلية الشائعة) وقواعد الجمع المعقدة.github.com/nicksnyder/go-i18n— مكتبة خارجية شائعة تدعم ملفات الترجمة بصيغ JSON و TOML و YAML، مع واجهة برمجة تطبيقات بسيطة واكتشاف تلقائي للغة.github.com/leonelquinteros/gotext— بديل خفيف الوزن يعمل مع تنسيق GNU gettext (ملفات .po/.mo)، مثالي للمشاريع الصغيرة.
في هذا الدليل، سنركز على go-i18n باعتباره الحل الأكثر توازنًا لتطبيقات الويب، لكن المفاهيم تنطبق على أي مكتبة.
تثبيت وإعداد go-i18n
للبدء، قم بتثبيت المكتبة وأداة سطر الأوامر للعمل مع الترجمات:
go get github.com/nicksnyder/go-i18n/v2/i18ngo install github.com/nicksnyder/go-i18n/v2/goi18n@latestأنشئ هيكل المشروع:
myapp/├── active.en.json├── active.ru.json├── main.go└── go.modإنشاء ملفات الترجمة
تستخدم المكتبة ملفات JSON للترجمات. مثال للغتين الإنجليزية والروسية:
active.en.json
{ "greeting": { "other": "Hello, {{.Name}}!" }, "cakes_count": { "one": "You have {{.Count}} cake.", "few": "You have {{.Count}} cakes.", "many": "You have {{.Count}} cakes.", "other": "You have {{.Count}} cakes." }}active.ru.json
{ "greeting": { "other": "Привет, {{.Name}}!" }, "cakes_count": { "one": "У вас {{.Count}} пирожное.", "few": "У вас {{.Count}} пирожных.", "many": "У вас {{.Count}} пирожных.", "other": "У вас {{.Count}} пирожных." }}لاحظ استخدام قواعد الجمع: one و few و many و other. في اللغة الروسية توجد 4 صيغ، بينما في الإنجليزية توجد صيغتان فقط (one/other). تختار المكتبة تلقائيًا الصيغة الصحيحة بناءً على الرقم.
مثال على الاستخدام في الكود
الآن سنكتب الكود الذي يقوم بتحميل الترجمات وعرض الرسائل المترجمة:
package main
import ( "fmt" "log"
"github.com/nicksnyder/go-i18n/v2/i18n" "golang.org/x/text/language")
func main() { // إنشاء حزمة ملفات اللغة bundle := i18n.NewBundle(language.English) bundle.RegisterUnmarshalFunc("json", json.Unmarshal)
// تحميل ملفات الترجمة _, err := bundle.LoadMessageFile("active.en.json") if err != nil { log.Fatal(err) } _, err = bundle.LoadMessageFile("active.ru.json") if err != nil { log.Fatal(err) }
// إنشاء مترجم للغة الروسية localizer := i18n.NewLocalizer(bundle, "ru")
// مثال 1: تحية بسيطة greeting, err := localizer.Localize(&i18n.LocalizeConfig{ MessageID: "greeting", TemplateD