التدويل (i18n) في Go (Golang) باستخدام مكتبة go-i18n
\nالتدويل (i18n) هو عملية تصميم البرامج بحيث يمكن تكييفها بسهولة مع لغات ومناطق مختلفة دون تغيير في الكود المصدري. في لغة Go (Golang)، واحدة من أشهر وأقوى المكتبات لتنفيذ i18n هي go-i18n. توفر هذه المكتبة للمطورين أدوات مريحة لإدارة الترجمات، ودعم صيغ الجمع (pluralization)، والعمل مع السياق.
\nفي هذه المقالة، سنشرح بالتفصيل كيفية استخدام go-i18n لتدويل تطبيق Go الخاص بك: من التثبيت إلى إنشاء نظام ترجمة كامل.
\n\nتثبيت مكتبة go-i18n
\nللبدء مع go-i18n، يجب تثبيت الحزمة باستخدام مدير التبعيات Go:
\ngo get github.com/nicksnyder/go-i18n/v2/i18n\nستحتاج أيضًا إلى حزمة لتحليل ملفات الترجمة (مثل JSON أو YAML):
\ngo get github.com/nicksnyder/go-i18n/v2/i18n/bundle\ngo get github.com/nicksnyder/go-i18n/v2/i18n/localizer\n\nهيكل ملفات الترجمة
\nتدعم مكتبة go-i18n تخزين الترجمات بتنسيقات JSON أو YAML أو TOML. يُوصى بإنشاء ملفات منفصلة لكل لغة. مثال على هيكل الدليل:
\nlocales/\n active.en.json # اللغة الإنجليزية\n active.ru.json # اللغة الروسية\n active.fr.json # اللغة الفرنسية\n\nمثال على ملف الترجمة (active.en.json)
\nلننشئ ملفًا للغة الإنجليزية يحتوي على رسالة واحدة مع دعم صيغ الجمع:
\n{\n "hello_world": {\n "other": "Hello, World!"\n },\n "messages_count": {\n "one": "You have {{.Count}} new message.",\n "few": "You have {{.Count}} new messages.",\n "many": "You have {{.Count}} new messages.",\n "other": "You have {{.Count}} new messages."\n }\n}\n\nمثال على ملف الترجمة (active.ru.json)
\nملف مماثل للغة الروسية مع مراعاة قواعد صيغ الجمع (واحد، بضعة، كثير):
\n{\n "hello_world": {\n "other": "Привет, мир!"\n },\n "messages_count": {\n "one": "У вас {{.Count}} новое сообщение.",\n "few": "У вас {{.Count}} новых сообщения.",\n "many": "У вас {{.Count}} новых сообщений.",\n "other": "У вас {{.Count}} сообщений."\n }\n}\n\nالتهيئة والاستخدام في الكود
\nالآن سنكتب كودًا بلغة Go يقوم بتحميل ملفات الترجمة واستخدامها لعرض الرسائل حسب اللغة المختارة.
\npackage main\n\nimport (\n "fmt"\n "github.com/nicksnyder/go-i18n/v2/i18n"\n "golang.org/x/text/language"\n)\n\nfunc main() {\n // إنشاء حزمة (مخزن الترجمات)\n bundle := i18n.NewBundle(language.English)\n bundle.RegisterUnmarshalFunc("json", json.Unmarshal)\n\n // تحميل ملفات الترجمة\n bundle.MustLoadMessageFile("locales/active.en.json")\n bundle.MustLoadMessageFile("locales/active.ru.json")\n\n // إنشاء مخصص للغة الروسية\n localizer := i18n.NewLocalizer(bundle, language.Russian.String())\n\n // مثال على استخدام رسالة بسيطة\n helloMsg, _ := localizer.Localize(&i18n.LocalizeConfig{\n MessageID: "hello_world",\n })\n fmt.Println(helloMsg) // الإخراج: Привет, мир!\n\n // مثال على استخدام الأعداد الجمعية\n for _, count := range []int{1, 2, 5, 10} {\n msg, _ := localizer.Localize(&i18n.LocalizeConfig{\n MessageID: "messages_count",\n PluralCount: count,\n TemplateData: map[string]interface{}{\n "Count": count,\n },\n })\n fmt.Println(msg)\n }\n}\n\nدعم صيغ الجمع (Pluralization)
\nإحدى الميزات الرئيسية لـ go-i18n هي المعالجة الصحيحة لصيغ الجمع. تستخدم المكتبة قواعد Unicode