diff --git a/locale/ar/client.json b/locale/ar/client.json
new file mode 100644
index 000000000..5e1edbf3a
--- /dev/null
+++ b/locale/ar/client.json
@@ -0,0 +1,153 @@
+{
+ "action.cancel": "إلغاء",
+ "action.change": "تغيير",
+ "action.close": "إغلاق",
+ "action.confirm": "تأكيد",
+ "action.delete": "حذف",
+ "action.edit": "تحرير",
+ "action.markallasread": "تحديد الكل كمقروء",
+ "action.ok": "موافق",
+ "action.respond": "رد",
+ "action.save": "حفظ",
+ "action.signin": "تسجيل الدخول",
+ "action.submit": "إرسال",
+ "enum.poststatus.completed": "مكتمل",
+ "enum.poststatus.declined": "مرفوض",
+ "enum.poststatus.deleted": "محذوف",
+ "enum.poststatus.duplicate": "مكرر",
+ "enum.poststatus.open": "مفتوح",
+ "enum.poststatus.planned": "مخطط له",
+ "enum.poststatus.started": "بدأ",
+ "error.expired.text": "الرابط الذي نقرت عليه قد انتهت صلاحيته.",
+ "error.expired.title": "منتهي الصلاحية",
+ "error.forbidden.text": "أنت غير مخول لعرض هذه الصفحة.",
+ "error.forbidden.title": "ممنوع",
+ "error.internalerror.text": "حدث خطأ ونحن نعمل على إصلاح المشكلة! سنكون في الخدمة قريباً.",
+ "error.internalerror.title": "عفواً! هذا غير متوقع...",
+ "error.pagenotfound.text": "الرابط الذي نقرت عليه قد يكون مكسورًا أو قد تكون الصفحة قد تمت إزالتها.",
+ "error.pagenotfound.title": "الصفحة غير موجودة",
+ "error.unauthorized.text": "أنت غير مخول لعرض هذه الصفحة.",
+ "error.unauthorized.title": "غير مخول",
+ "home.form.defaultinvitation": "أدخل اقتراحك هنا...",
+ "home.form.defaultwelcomemessage": "نود أن نسمع ما تفكر به.\n\nماذا يمكننا أن نفعل بشكل أفضل؟ هذا هو المكان المناسب للتصويت والمناقشة ومشاركة الأفكار.",
+ "home.lonely.suggestion": "يوصى بإنشاء <0>على الأقل 30> اقتراحات هنا قبل مشاركة هذا الموقع. المحتوى الأولي مهم لبدء جذب جمهورك.",
+ "home.lonely.text": "لم يتم إنشاء أي منشورات حتى الآن.",
+ "home.postfilter.label.view": "عرض",
+ "home.postfilter.option.mostdiscussed": "الأكثر مناقشة",
+ "home.postfilter.option.mostwanted": "الأكثر رغبة",
+ "home.postfilter.option.myvotes": "تصويتي",
+ "home.postfilter.option.recent": "حديث",
+ "home.postfilter.option.trending": "الشائع",
+ "home.postinput.description.placeholder": "وصف اقتراحك (اختياري)",
+ "home.postscontainer.label.noresults": "لم تتطابق أي نتائج مع بحثك، جرب شيئًا مختلفًا.",
+ "home.postscontainer.label.viewmore": "عرض المزيد من المنشورات",
+ "home.postscontainer.query.placeholder": "بحث",
+ "home.similar.subtitle": "فكر في التصويت على المنشورات الموجودة بدلاً من ذلك.",
+ "home.similar.title": "منشورات مشابهة",
+ "home.tagsfilter.label.with": "مع",
+ "home.tagsfilter.selected.none": "أي وسم",
+ "label.actions": "إجراءات",
+ "label.avatar": "الصورة الرمزية",
+ "label.custom": "مخصص",
+ "label.description": "وصف",
+ "label.discussion": "نقاش",
+ "label.email": "البريد الإلكتروني",
+ "label.gravatar": "Gravatar",
+ "label.letter": "حرف",
+ "label.moderation": "إشراف",
+ "label.name": "الاسم",
+ "label.none": "لا شيء",
+ "label.notifications": "إشعارات",
+ "label.or": "أو",
+ "label.subscribe": "اشتراك",
+ "label.tags": "وسوم",
+ "label.unread": "غير مقروء",
+ "label.unsubscribe": "إلغاء الاشتراك",
+ "label.voters": "المصوتون",
+ "legal.agreement": "لقد قرأت وأوافق على <0/> و <1/>.",
+ "legal.notice": "بتسجيل الدخول، أنت توافق على <0/> و <1/>.",
+ "legal.privacypolicy": "سياسة الخصوصية",
+ "legal.termsofservice": "شروط الخدمة",
+ "menu.administration": "إدارة",
+ "menu.mysettings": "إعداداتي",
+ "menu.signout": "تسجيل الخروج",
+ "menu.sitesettings": "إعدادات الموقع",
+ "modal.changeemail.header": "تأكيد بريدك الإلكتروني الجديد",
+ "modal.changeemail.text": "لقد أرسلنا للتو رابط تأكيد إلى <0>{0}0>. <1/> انقر على الرابط لتحديث بريدك الإلكتروني.",
+ "modal.completeprofile.header": "إكمال ملفك الشخصي",
+ "modal.completeprofile.name.placeholder": "الاسم",
+ "modal.completeprofile.text": "لأن هذه هي المرة الأولى التي تسجل فيها الدخول، يرجى إدخال اسمك.",
+ "modal.deleteaccount.header": "حذف الحساب",
+ "modal.deleteaccount.text": "<0>عند اختيارك حذف حسابك، سنمحو جميع معلوماتك الشخصية إلى الأبد. سيبقى المحتوى الذي قمت بنشره، ولكنه سيصبح مجهولًا.0><1>هذه العملية لا رجعة فيها. <2>هل أنت متأكد؟2>1>",
+ "modal.deletecomment.header": "حذف التعليق",
+ "modal.deletecomment.text": "هذه العملية لا رجعة فيها. <0>هل أنت متأكد؟0>",
+ "modal.showvotes.message.zeromatches": "لم يتم العثور على مستخدمين مطابقين لـ <0>{0}0>.",
+ "modal.showvotes.query.placeholder": "ابحث عن المستخدمين بالاسم...",
+ "modal.signin.header": "تسجيل الدخول للمشاركة والتصويت",
+ "mynotifications.label.readrecently": "مقروء في آخر 30 يومًا.",
+ "mynotifications.message.nounread": "لا توجد إشعارات غير مقروءة.",
+ "mynotifications.page.subtitle": "ابقَ على اطلاع بما يحدث",
+ "mynotifications.page.title": "الإشعارات",
+ "mysettings.apikey.documentation": "لتعلم كيفية استخدام API، اقرأ <0>التوثيق الرسمي0>.",
+ "mysettings.apikey.generate": "إعادة توليد مفتاح API",
+ "mysettings.apikey.newkey": "مفتاح API الجديد هو: <0>{0}0>",
+ "mysettings.apikey.newkeynotice": "احفظه بأمان على خوادمك ولا تخزنه أبدًا في جانب العميل لتطبيقك.",
+ "mysettings.apikey.notice": "يتم عرض مفتاح API فقط عند توليده. إذا فقدت مفتاحك أو تعرض للاختراق، قم بتوليد مفتاح جديد ودون ملاحظة ذلك.",
+ "mysettings.apikey.title": "مفتاح API",
+ "mysettings.dangerzone.delete": "حذف حسابي",
+ "mysettings.dangerzone.notice": "هذه العملية لا رجعة فيها. يرجى التأكد.",
+ "mysettings.dangerzone.text": "عند اختيارك حذف حسابك، سنمحو جميع معلوماتك الشخصية إلى الأبد. سيبقى المحتوى الذي قمت بنشره، ولكنه سيصبح مجهولًا.",
+ "mysettings.dangerzone.title": "حذف الحساب",
+ "mysettings.message.avatar.custom": "نقبل صور JPG، GIF و PNG، أقل من 100KB وبنسبة عرض إلى ارتفاع 1:1 بأبعاد لا تقل عن 50x50 بكسل.",
+ "mysettings.message.avatar.gravatar": "سيتم استخدام <0>Gravatar0> بناءً على بريدك الإلكتروني. إذا لم يكن لديك Gravatar، سيتم إنشاء صورة رمزية من حرف أولي بناءً على الأحرف الأولى من اسمك.",
+ "mysettings.message.avatar.letter": "سيتم إنشاء صورة رمزية من حرف أولي بناءً على الأحرف الأولى من اسمك.",
+ "mysettings.message.noemail": "حسابك لا يحتوي على بريد إلكتروني.",
+ "mysettings.message.privateemail": "بريدك الإلكتروني خاص ولن يتم عرضه علنًا أبدًا.",
+ "mysettings.notification.channelemail": "البريد الإلكتروني",
+ "mysettings.notification.channelweb": "الويب",
+ "mysettings.notification.event.discussion": "نقاش",
+ "mysettings.notification.event.discussion.staff": "التعليقات على جميع المنشورات إلا إذا تم إلغاء الاشتراك بشكل فردي",
+ "mysettings.notification.event.discussion.visitors": "التعليقات على المنشورات التي قمت بالاشتراك فيها",
+ "mysettings.notification.event.newpost": "منشور جديد",
+ "mysettings.notification.event.newpost.staff": "المنشورات الجديدة على هذا الموقع",
+ "mysettings.notification.event.newpost.visitors": "المنشورات الجديدة على هذا الموقع",
+ "mysettings.notification.event.statuschanged": "تغيير الحالة",
+ "mysettings.notification.event.statuschanged.staff": "تغيير الحالة على جميع المنشورات إلا إذا تم إلغاء الاشتراك بشكل فردي",
+ "mysettings.notification.event.statuschanged.visitors": "تغيير الحالة على المنشورات التي قمت بالاشتراك فيها",
+ "mysettings.notification.message.emailonly": "ستتلقى إشعارات <0>البريد الإلكتروني0> حول {about}.",
+ "mysettings.notification.message.none": "لن تتلقى <0>أي0> إشعار حول هذا الحدث.",
+ "mysettings.notification.message.webandemail": "ستتلقى إشعارات <0>الويب0> و<1>البريد الإلكتروني1> حول {about}.",
+ "mysettings.notification.message.webonly": "ستتلقى إشعارات <0>الويب0> حول {about}.",
+ "mysettings.notification.title": "استخدم اللوحة التالية لاختيار الأحداث التي ترغب في تلقي إشعارات عنها",
+ "mysettings.page.subtitle": "إدارة إعدادات ملفك الشخصي",
+ "mysettings.page.title": "الإعدادات",
+ "page.backhome": "أعدني إلى <0>{0}0> الصفحة الرئيسية.",
+ "page.notinvited.text": "لم نتمكن من العثور على حساب لبريدك الإلكتروني.",
+ "page.notinvited.title": "غير مدعو",
+ "page.pendingactivation.text": "لقد أرسلنا لك بريدًا إلكترونيًا يحتوي على رابط لتفعيل حسابك.",
+ "page.pendingactivation.text2": "يرجى التحقق من بريدك الوارد لتفعيله.",
+ "page.pendingactivation.title": "حسابك في انتظار التفعيل",
+ "showpost.commentinput.placeholder": "اترك تعليقاً",
+ "showpost.discussionpanel.emptymessage": "لم يقم أحد بالتعليق بعد.",
+ "showpost.label.author": "نشر بواسطة <0/> · <1/>",
+ "showpost.message.nodescription": "لم يتم توفير وصف.",
+ "showpost.moderationpanel.text.help": "هذه العملية <0>لا يمكن0> التراجع عنها.",
+ "showpost.moderationpanel.text.placeholder": "لماذا تحذف هذا المنشور؟ (اختياري)",
+ "showpost.notificationspanel.message.subscribed": "أنت تتلقى إشعارات حول النشاط على هذا المنشور.",
+ "showpost.notificationspanel.message.unsubscribed": "لن تتلقى أي إشعار حول هذا المنشور.",
+ "showpost.postsearch.numofvotes": "{0} صوت",
+ "showpost.postsearch.query.placeholder": "ابحث عن المنشور الأصلي...",
+ "showpost.responseform.message.mergedvotes": "ستدمج الأصوات من هذا المنشور في المنشور الأصلي.",
+ "showpost.responseform.text.placeholder": "ما الذي يحدث مع هذا المنشور؟ دع مستخدميك يعرفون ما هي خططك...",
+ "showpost.votespanel.more": "+{extraVotesCount} أكثر",
+ "showpost.votespanel.seedetails": "شاهد التفاصيل",
+ "signin.message.email": "أدخل عنوان بريدك الإلكتروني لتسجيل الدخول",
+ "signin.message.emaildisabled": "تم تعطيل المصادقة عبر البريد الإلكتروني من قبل المسؤول. إذا كان لديك حساب مسؤول وتحتاج إلى تجاوز هذا التقييد، يرجى <0>النقر هنا0>.",
+ "signin.message.emailsent": "لقد أرسلنا للتو رابط تأكيد إلى <0>{email}0>. انقر على الرابط وستسجل الدخول.",
+ "signin.message.locked.text": "لتفعيل هذا الموقع، قم بتسجيل الدخول بحساب مسؤول وقم بتحديث الإعدادات المطلوبة.",
+ "signin.message.locked.title": "<0>{0}0> مغلق حاليًا.",
+ "signin.message.onlyadmins": "حاليًا مسموح فقط بتسجيل الدخول إلى حساب مسؤول",
+ "signin.message.private.text": "إذا كان لديك حساب أو دعوة، يمكنك استخدام الخيارات التالية لتسجيل الدخول.",
+ "signin.message.private.title": "<0>{0}0> مساحة خاصة، يجب عليك تسجيل الدخول للمشاركة والتصويت.",
+ "{count, plural, one {# وسم} other {# وسوم}}": "{count, plural, one {# وسم} other {# وسوم}}"
+}
diff --git a/locale/ar/server.json b/locale/ar/server.json
new file mode 100644
index 000000000..bac763d8c
--- /dev/null
+++ b/locale/ar/server.json
@@ -0,0 +1,62 @@
+{
+ "property.avatarType": "نوع الصورة الرمزية",
+ "property.name": "الاسم",
+ "property.image": "صورة",
+ "property.customdomain": "نطاق مخصص",
+ "property.key": "المفتاح",
+ "property.email": "البريد الإلكتروني",
+ "property.title": "العنوان",
+ "property.comment": "تعليق",
+ "property.status": "الحالة",
+ "validation.required": "{name} مطلوب.",
+ "validation.invalid": "{name} غير صالح.",
+ "validation.invalidvalue": "{name} يحتوي على قيمة غير صالحة '{value}'.",
+ "validation.maxstringlen": "{name} يجب أن يحتوي على أقل من {len} حرفًا.",
+ "validation.custom.maxattachments": "يُسمح بحد أقصى {number} من المرفقات لكل منشور.",
+ "validation.custom.differentemail": "اختر بريدًا إلكترونيًا مختلفًا.",
+ "validation.custom.emailtaken": "هذا البريد الإلكتروني مستخدم بالفعل من قبل شخص آخر.",
+ "validation.custom.descriptivetitle": "يجب أن يكون العنوان أكثر وصفًا.",
+ "validation.custom.duplicatetitle": "تم نشر هذا من قبل.",
+ "validation.custom.selfduplicate": "لا يمكن أن يكون مكررًا لنفسه.",
+ "validation.custom.originalpostnotfound": "لم يتم العثور على المنشور الأصلي.",
+ "validation.custom.cannotdeleteduplicatepost": "لا يمكن حذف هذا المنشور لأنه مرجع لمنشور مكرر.",
+ "validation.custom.unknownsettings": "إعدادات غير معروفة باسم '{name}'",
+ "validation.custom.invalidemail": "'{email}' ليس عنوان بريد إلكتروني صالح.",
+ "validation.custom.invalidurl": "'{url}' ليس عنوان URL صالح.",
+ "validation.custom.invalidcustomdomain": "'{domain}' ليس نطاق مخصص صالح.",
+ "validation.custom.customdomaintaken": "هذا النطاق المخصص مستخدم بالفعل من قبل شخص آخر.",
+ "validation.custom.unsupportedfileformat": "صيغة هذا الملف غير مدعومة.",
+ "validation.custom.minimagedimensions": "يجب أن تكون الصورة بأبعاد لا تقل عن {width}x{height} بكسل.",
+ "validation.custom.imagesquareratio": "يجب أن تكون نسبة عرض الصورة إلى ارتفاعها 1:1.",
+ "validation.custom.maximagesize": "يجب أن يكون حجم الصورة أقل من {kilobytes} كيلو بايت.",
+ "enum.poststatus.open": "مفتوح",
+ "enum.poststatus.started": "بدأ",
+ "enum.poststatus.completed": "مكتمل",
+ "enum.poststatus.declined": "مرفوض",
+ "enum.poststatus.planned": "مخطط له",
+ "enum.poststatus.duplicate": "مكرر",
+ "enum.poststatus.deleted": "محذوف",
+ "email.change_emailaddress.subject": "تأكيد بريدك الإلكتروني الجديد",
+ "email.change_emailaddress.request": "لقد طلبت تغيير بريدك الإلكتروني من {oldEmail} إلى {newEmail}.",
+ "email.subscription.view": "عرضه في متصفحك",
+ "email.subscription.change": "تغيير تفضيلات الإشعارات الخاصة بك",
+ "email.subscription.unsubscribe": "إلغاء الاشتراك منه",
+ "email.greetings": "مرحباً!",
+ "email.greetings_name": "مرحباً، {name}!",
+ "email.operation_confirmation": "انقر على الرابط أدناه لتأكيد هذه العملية.",
+ "email.footer.noreply": "تم إرسال هذا البريد الإلكتروني من عنوان إشعار فقط لا يقبل الرسائل الواردة. يرجى عدم الرد على هذه الرسالة.",
+ "email.change_status.duplicate": "{title} ({postLink}) تم إغلاقه باعتباره مكرر لـ {duplicate}.",
+ "email.change_status.others": "تم تغيير حالة {title} ({postLink}) إلى {status}.",
+ "email.delete_post.text": "{title} تم حذفه.",
+ "email.new_comment.text": "{userName} ترك تعليقًا على {title} ({postLink}).",
+ "email.new_post.text": "{userName} أنشأ منشورًا جديدًا {title} ({postLink}).",
+ "email.signin_email.subject": "تسجيل الدخول إلى {siteName}",
+ "email.signin_email.text": "طلبت منا إرسال رابط تسجيل الدخول لك وها هو.",
+ "email.signin_email.confirmation": "انقر على الرابط أدناه لتسجيل الدخول إلى {siteName}.",
+ "email.signup_email.subject": "موقع Fider الجديد الخاص بك",
+ "email.signup_email.text": "أنت على بعد خطوة واحدة من تفعيل موقع Fider الخاص بك.",
+ "email.signup_email.confirmation": "من خلال الرابط أدناه يمكنك التحقق من عنوان بريدك الإلكتروني وإكمال عملية التفعيل.",
+ "email.footer.subscription_notice": "أنت تتلقى هذا البريد الإلكتروني لأنك مشترك في هذا المنشور. يمكنك {view}، {unsubscribe} أو {change}.",
+ "email.footer.subscription_notice2": "أنت تتلقى هذا البريد الإلكتروني لأنك مشترك في هذا المنشور. يمكنك {change}.",
+ "email.footer.subscription_notice3": "أنت تتلقى هذا البريد الإلكتروني لأنك مشترك في هذا المنشور. يمكنك {view} أو {change}."
+}
diff --git a/locale/locales.ts b/locale/locales.ts
index 63e0e651f..d8a9aeafb 100644
--- a/locale/locales.ts
+++ b/locale/locales.ts
@@ -39,6 +39,9 @@ const locales: { [key: string]: Locale } = {
el: {
text: "Greek",
},
+ ar: {
+ text: "Arabic",
+ },
}
export default locales