diff --git a/frontend/app/locales/ar.json b/frontend/app/locales/ar.json
new file mode 100644
index 00000000..e2da53a9
--- /dev/null
+++ b/frontend/app/locales/ar.json
@@ -0,0 +1,177 @@
+ {
+ "auth.back": "رجوع",
+ "auth.email-address": "البريد الإلكتروني",
+ "auth.loading": "جارٍ التحميل...",
+ "auth.oauth-button": "سجل دخولاً عبر {provider}",
+ "auth.oauth-source": "عبر التواصل الاجتماعي",
+ "auth.open-profile": "الصفحة الشخصية",
+ "auth.or": "أو",
+ "auth.signin": "دخول",
+ "auth.signout": "خروج",
+ "auth.submit": "إرسال",
+ "auth.symbols-restriction": "اسم المستخدم ينبغي أن يحتوي فقط على حروف، أرقام، مسافات، أو شرطات",
+ "auth.telegram-check": "تأكد",
+ "auth.telegram-link": "عبر الرابط",
+ "auth.telegram-message-1": "افتح تيليجرام",
+ "auth.telegram-message-2": "انقر \"ابدأ\" هناك.",
+ "auth.telegram-message-3": "ثم انقر \"تأكد\" أسفله.",
+ "auth.telegram-optional-qr": "أو عبر مسح رمز QR",
+ "auth.telegram-qr": "رمز QR للتيليجرام",
+ "auth.user-not-found": "لا مستخدم بهذا الاسم",
+ "auth.username": "اسم المستخدم",
+ "authPanel.disable-comments": "عطّل التعليقات",
+ "authPanel.disabled-cookies": "ألغِ حظرَ كوكيز الطرف الثالث للدخول أو أنشئ تعليقاً في",
+ "authPanel.enable-comments": "فعل التعليقات",
+ "authPanel.enable-cookies": "اسمح بالكوكيز للدخول والتعليق",
+ "authPanel.hide-settings": "أخفِ الإعدادات",
+ "authPanel.new-page": "صفحة جديدة",
+ "authPanel.read-only": "للقراءة فقط",
+ "authPanel.show-settings": "أظهر الإعدادات",
+ "blockingDuration.day": "ليومٍ",
+ "blockingDuration.month": "لشهرٍ",
+ "blockingDuration.permanently": "دائماً",
+ "blockingDuration.week": "لأسبوعٍ",
+ "comment.block": "حظر",
+ "comment.block-user": "هل تودُّ حظر {userName} لمدة {duration}؟",
+ "comment.blocked-user": "محظور",
+ "comment.blocking-period": "فترة الحظر",
+ "comment.cancel": "إلغاء",
+ "comment.controversy": "مستوى النقاش: {value}",
+ "comment.copied": "نُسِخ!",
+ "comment.copy": "نسخ",
+ "comment.delete": "حذف",
+ "comment.delete-message": "هل تود حذف هذا التعليق؟",
+ "comment.deleted-comment": "هذا التعليق محذوف",
+ "comment.deleted-user": "حُذِف",
+ "comment.edit": "عدّل",
+ "comment.expired-time": "انتهى وقت التعديل",
+ "comment.go-to-parent": "اذهب للتعليق الأصلي",
+ "comment.hide": "أخفِ",
+ "comment.hide-user-comment": "هل تود إخفاء تعليقات {userName}؟",
+ "comment.pin": "ثبّت",
+ "comment.pin-comment": "هل تودُّ تثبيت هذا التعليق؟",
+ "comment.reply": "ردّ",
+ "comment.time": "{day} في {time}",
+ "comment.toggle-verification": "فعّل التحقق",
+ "comment.unblock": "ألغِ حظر",
+ "comment.unblock-user": "هل تود إلغاء حظر هذا المستخدم؟",
+ "comment.unpin": "إلغاء تثبيت",
+ "comment.unpin-comment": "هل تودُّ إلغاء تثبيت هذا التعليق؟",
+ "comment.unverified-user": "مستخدم غير مُحقَّق",
+ "comment.unverify-user": "هل تودُّ إلغاء التحقق من {userName}؟",
+ "comment.verified-user": "مستخدم مُحَقَّق",
+ "comment.verify-user": "هل تود تحقيق {userName}؟",
+ "comment.vote-error": "خطأ تصويت: {voteErrorMessage}",
+ "commentForm.anonymous-uploading-disabled": "رفع الصور مُعطّل للمجهولين. فضلاً سجل الدخول لإرفاق صور.",
+ "commentForm.exceeded-size": "{fileName} يتجاوز حد الرفع: {maxImageSize}",
+ "commentForm.input-placeholder": "تعليقك هنا",
+ "commentForm.new-comment": "تعليق جديد",
+ "commentForm.notice-about-styling": "تنميط الكتابة بالماركداون مدعوم",
+ "commentForm.preview": "عاين",
+ "commentForm.reply": "رُد",
+ "commentForm.save": "احفظ",
+ "commentForm.send": "أرسل",
+ "commentForm.subscribe-by": "اشترك عبر",
+ "commentForm.subscribe-or": "أو",
+ "commentForm.unauthorized-uploading-disabled": "رفع الصور مُعطّل لغير المُتحقق منهم. عليك بالدخول قبل الرفع.",
+ "commentForm.unexpected-error": "ثمّة عطلٌ ما. فضلاً عاود المحاولة لاحقاً.",
+ "commentForm.upload-file-fail": "رفع {fileName} فشل بخطأ: \"{errorMessage}",
+ "commentForm.uploading": "جارٍ الرفع...",
+ "commentForm.uploading-file": "جارٍ رفع {fileName}...",
+ "commentsSort.best": "الأفضل",
+ "commentsSort.least-controversial": "الأقل جدلاً",
+ "commentsSort.least-recently-updated": "الأقدم تحديثاً",
+ "commentsSort.most-controversial": "الأكثر جدلاً",
+ "commentsSort.newest": "الأجدد",
+ "commentsSort.oldest": "الأقدم",
+ "commentsSort.recently-updated": "الأجدد تحديثاً",
+ "commentsSort.worst": "الأسوأ",
+ "empty-state": "لا تعليقات للآن",
+ "errors.0": "ثمّة عطلٌ ما. فضلاً عاود المحاولة لاحقاً.",
+ "errors.1": "لا يمكن إيجاد التعليق. فضلاً حدث الصفحة وعاود المحاولة.",
+ "errors.10": "وقت تعديل التعليق فات.",
+ "errors.11": "للتعليق ردُّ بالفعل. لا يمكنك التعديل.",
+ "errors.12": "لا يُمكن حفظ نتيجة التصويت. فضلاً عاود المحاولة لاحقاً.",
+ "errors.13": "لا يمكنك التصويت لتعليقك.",
+ "errors.14": "لقد صوّتَّ بالفعل للتعليق",
+ "errors.15": "تصويتات فوق المسموح للتعليق.",
+ "errors.16": "التعليق وصل لأقل مستوى.",
+ "errors.17": "رُفض الإجراء. فضلاً عاود المحاولة لاحقاً.",
+ "errors.18": "الملف المطلوب لا يمكن إيجاده",
+ "errors.19": "التعليق يحتوي على كلمات محظورة.",
+ "errors.2": "خطأ في معالجة الطلب القادم.",
+ "errors.20": "الصورة المنشورة غير موجودة. فضلاً عاود رفعها.",
+ "errors.3": "لا صلاحية لك في هذا الإجراء.",
+ "errors.4": "محتويات التعليق غير صالحة",
+ "errors.5": "التعليق لا يمكن إيجاده. فضلاً عاود تحميل الصفحة.",
+ "errors.6": "الموقع لا يمكن إيجاده. فضلاً عاود تحميل الصفحة",
+ "errors.7": "المستخدم محظور",
+ "errors.8": "لا يمكن نشر تعليقات على هذه الصفحة. التعليقات مؤرشفة للقراءة فقط.",
+ "errors.9": "فشل تعديل التعليق. فضلاً، عاود المحاولة.",
+ "errors.failed-fetch": "فشل الاتصال. فضلاً تأكد من اتصالك بالإنترنت.",
+ "errors.forbidden": "ممنوع.",
+ "errors.not-authorized": "غير مخوّل بالدخول.",
+ "errors.to-many-request": "لقد وصلت للحد الأقصى من الطلبات.",
+ "errors.unexpected-error": "ثمة عطلٌ ما.",
+ "profile.close": "أغلق الملف.",
+ "profile.request-to-delete-data": "طلب حذف بياناتي",
+ "retry": "إعادة المحاولة",
+ "root.pinned-comments": "التعليقات المثبتة",
+ "root.powered-by": "صنع باستخدام Remark42",
+ "root.show-more": "أظهر المزيد",
+ "settings.block": "حظر",
+ "settings.block-time": "إلى {day} في {time}",
+ "settings.block-user": "هل تودُّ حظر {userName}؟",
+ "settings.blocked-users-header": "المحظورون:",
+ "settings.blocked-users-title": "المحظورون",
+ "settings.hidden-user-header": "المخفيون:",
+ "settings.hidden-users-title": "المخفيون",
+ "settings.hide": "أخفِ",
+ "settings.no-blocked-users": "لا يوجد محظورون",
+ "settings.no-hidden-users": "لا يوجد مخفيون",
+ "settings.permanently": "دائماً",
+ "settings.show": "أظهر",
+ "settings.unblock": "إلغِ حظر",
+ "settings.unblock-user": "هل تودُّ إلغاء حظر {userName}؟",
+ "settings.unknown": "غير معروف",
+ "sort-by": "صنّف حسب",
+ "subscribeByEmail.back": "عودة",
+ "subscribeByEmail.close": "أغلق",
+ "subscribeByEmail.email": "البريد الإلكتروني",
+ "subscribeByEmail.have-been-subscribed": "لقد اشتركت في تحديثات البريد الإلكتروني",
+ "subscribeByEmail.have-been-unsubscribed": "لقد ألغيت اشتراكك في تحديثات البريد الإلكتروني",
+ "subscribeByEmail.only-registered-users": "متاح للمُسجّلين فقط",
+ "subscribeByEmail.submit": "أرسل",
+ "subscribeByEmail.subscribe": "اشترك",
+ "subscribeByEmail.subscribe-by-email": "اشترك عبر البريد",
+ "subscribeByEmail.subscribe-to-replies": "اشترك للردود",
+ "subscribeByEmail.subscribed": "أنت مشترك بالتحديثات عبر البريد",
+ "subscribeByEmail.unsubscribe": "إلغاء الاشتراك",
+ "subscribeByRSS.button-title": "اشترك عبر RSS",
+ "subscribeByRSS.replies": "الردود",
+ "subscribeByRSS.site": "الموقع",
+ "subscribeByRSS.thread": "سلسلة ردود",
+ "subscribeByRSS.title": "RSS",
+ "token": "رمز",
+ "token.expired": "الرمز انتهت صلاحيته",
+ "token.invalid": "الرمز غير صالح",
+ "toolbar.attach-image": "أرفق صورةً، أو اسحبها وأسقطها، أو الصقها من الحافظة",
+ "toolbar.bold": "أضف نصّاً عريضاً {shortcut}",
+ "toolbar.code": "أدرج نصّاً برمجياً",
+ "toolbar.header": "أضف عنواناً",
+ "toolbar.italic": "أضف نصاً مائلاً {shortcut}",
+ "toolbar.link": "أضف رابطاً {shortcut}",
+ "toolbar.ordered-list": "أضف قائمةً مرقمةً",
+ "toolbar.quote": "أضف اقتباساً",
+ "toolbar.unordered-list": "أضف قائمةً مُنقّطةً",
+ "user.comments": "تعليقات",
+ "user.load-more": "تحميل المزيد",
+ "user.my-comments": "تعليقات",
+ "vote.anonymous": "لا يُسمح بتصويت المجهولين",
+ "vote.deleted": "لا يمكن التصويت لتعليقٍ محذوف",
+ "vote.guest": "سجل الدخول للتصويت",
+ "vote.only-positive": "مسموح بنقاطٍ موجبة فقط",
+ "vote.only-post-page": "التصويت مسموح على صفحة المنشور فقط",
+ "vote.own-comment": "لا يمكنك التصويت لتعليقك.",
+ "vote.readonly": "لا يمكنك التصويت على مواضيع للقراءة فقط."
+ }
\ No newline at end of file
diff --git a/frontend/app/utils/loadLocale.ts b/frontend/app/utils/loadLocale.ts
index 20d52971..282deffd 100644
--- a/frontend/app/utils/loadLocale.ts
+++ b/frontend/app/utils/loadLocale.ts
@@ -51,6 +51,9 @@ export async function loadLocale(locale: string): Promise
if (locale === 'it') {
return import(/* webpackChunkName: "it" */ '../locales/it.json').then((res) => res.default).catch(() => enMessages);
}
+ if (locale === 'ar') {
+ return import(/* webpackChunkName: "ar" */ '../locales/ar.json').then((res) => res.default).catch(() => enMessages);
+ }
return enMessages;
}
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index a335bb7b..6f5b441f 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -29323,9 +29323,9 @@
"dev": true
},
"follow-redirects": {
- "version": "1.14.8",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz",
- "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==",
+ "version": "1.14.7",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
+ "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==",
"dev": true
},
"for-in": {
diff --git a/frontend/tasks/supportedLocales.json b/frontend/tasks/supportedLocales.json
index 80fc7de1..15457338 100644
--- a/frontend/tasks/supportedLocales.json
+++ b/frontend/tasks/supportedLocales.json
@@ -1 +1 @@
-["en", "ru", "de", "fi", "es", "zh", "tr", "bg", "ua", "pl", "vi", "be", "fr", "ja", "ko", "bp", "it"]
+["en", "ru", "de", "fi", "es", "zh", "tr", "bg", "ua", "pl", "vi", "be", "fr", "ja", "ko", "bp", "it", "ar"]