Просмотр исходного кода

Add Arabic (ar) translation (#9502)

* Add Arabic translation

Add a complete Arabic (ar) locale: all interface strings in
app/i18n/ar, Arabic plural forms (nplurals=6), registration of the
language name in gen.lang.ar for all languages, and the regenerated
translation status tables in the READMEs.

* Fix Arabic plural rule flagged by PHPStan
ABDULLAH 5 часов назад
Родитель
Сommit
86b25d1013

+ 1 - 0
README.fr.md

@@ -236,6 +236,7 @@ Voir le [dépôt dédié à ces extensions](https://github.com/FreshRSS/Extensio
 
 | Langage | Progression | |
 | - | - | - |
+| العربية (ar) | ■■■■■■■■■■ 100% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Far+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Azərbaycanca (az) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Faz+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Беларуская (be) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fbe+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Čeština (cs) | ■■■■■■■■・・ 81% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fcs+%2F%28TODO%7CDIRTY%29%24%2F) |

+ 1 - 0
README.md

@@ -132,6 +132,7 @@ See the [repository dedicated to those extensions](https://github.com/FreshRSS/E
 
 | Language | Progress | |
 | - | - | - |
+| العربية (ar) | ■■■■■■■■■■ 100% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Far+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Azərbaycanca (az) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Faz+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Беларуская (be) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fbe+%2F%28TODO%7CDIRTY%29%24%2F) |
 | Čeština (cs) | ■■■■■■■■・・ 81% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fcs+%2F%28TODO%7CDIRTY%29%24%2F) |

+ 165 - 0
app/i18n/ar/admin.php

@@ -0,0 +1,165 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its   *
+ * state. When there is no comment, it means the entry is fully translated.   *
+ * The recognized comments are (comment matching is case-insensitive):        *
+ *   + TODO: the entry has never been translated.                             *
+ *   + DIRTY: the entry has been translated but needs to be updated.          *
+ *   + IGNORE: the entry does not need to be translated.                      *
+ * When a comment is not recognized, it is discarded.                         *
+ ******************************************************************************/
+
+return array(
+	'auth' => array(
+		'allow_anonymous' => 'السماح بالقراءة المجهولة لمقالات المستخدم الافتراضي (%s)',
+		'allow_anonymous_refresh' => 'السماح بالتحديث المجهول للمقالات',
+		'api_enabled' => 'السماح بالوصول إلى <abbr>API</abbr> <small>(مطلوب لتطبيقات الجوال ومشاركة استعلامات المستخدم)</small>',
+		'form' => 'نموذج الويب (تقليدي، يتطلب JavaScript)',
+		'http' => 'HTTP (متقدم: يديره خادم الويب، OIDC، SSO…)',
+		'none' => 'لا شيء (خطير)',
+		'title' => 'المصادقة',
+		'token' => 'رمز المصادقة الرئيسي',
+		'token_help' => 'يسمح بالوصول إلى جميع مخرجات RSS للمستخدم بالإضافة إلى تحديث الخلاصات دون مصادقة:',
+		'type' => 'طريقة المصادقة',
+	),
+	'extensions' => array(
+		'author' => 'المؤلف',
+		'community' => 'إضافات المجتمع المتاحة',
+		'description' => 'الوصف',
+		'disabled' => 'معطلة',
+		'empty_list' => 'لا توجد إضافات مثبتة',
+		'empty_list_help' => 'تحقق من السجلات لتحديد سبب قائمة الإضافات الفارغة.',
+		'enabled' => 'مفعلة',
+		'is_compatible' => 'متوافقة',
+		'latest' => 'مثبتة',
+		'name' => 'الاسم',
+		'no_configure_view' => 'لا يمكن إعداد هذه الإضافة.',
+		'system' => array(
+			'_' => 'إضافات النظام',
+			'no_rights' => 'إضافة نظام (ليس لديك الأذونات المطلوبة)',
+		),
+		'title' => 'الإضافات',
+		'update' => 'يتوفر تحديث',
+		'user' => 'إضافات المستخدم',
+		'version' => 'الإصدار',
+	),
+	'stats' => array(
+		'_' => 'الإحصاءات',
+		'all_feeds' => 'جميع الخلاصات',
+		'category' => 'الفئة',
+		'date_published' => 'تاريخ النشر',
+		'date_received' => 'تاريخ الاستلام',
+		'entry_count' => 'عدد الإدخالات',
+		'entry_per_category' => 'الإدخالات حسب الفئة',
+		'entry_per_day' => 'الإدخالات في اليوم (آخر 30 يومًا)',
+		'entry_per_day_of_week' => 'حسب يوم الأسبوع (المعدل: %.2f رسالة)',
+		'entry_per_hour' => 'حسب الساعة (المعدل: %.2f رسالة)',
+		'entry_per_month' => 'حسب الشهر (المعدل: %.2f رسالة)',
+		'entry_repartition' => 'توزيع الإدخالات',
+		'feed' => 'الخلاصة',
+		'feed_per_category' => 'الخلاصات حسب الفئة',
+		'idle' => 'الخلاصات الخاملة',
+		'main' => 'الإحصاءات الرئيسية',
+		'main_stream' => 'التدفق الرئيسي',
+		'nb_unreads' => 'عدد المقالات غير المقروءة',
+		'no_idle' => 'لا توجد خلاصات خاملة!',
+		'number_entries' => '%d مقال',
+		'overview' => 'نظرة عامة',
+		'percent_of_total' => '% من الإجمالي',
+		'repartition' => 'توزيع المقالات: %s',
+		'status_favorites' => 'المفضلة',
+		'status_read' => 'مقروءة',
+		'status_total' => 'الإجمالي',
+		'status_unread' => 'غير مقروءة',
+		'title' => 'الإحصاءات',
+		'top_feed' => 'أفضل عشر خلاصات',
+		'unread_dates' => 'التواريخ ذات المقالات غير المقروءة الأكثر',
+	),
+	'system' => array(
+		'_' => 'إعدادات النظام',
+		'auto-update-url' => 'عنوان URL لخادم التحديث التلقائي',
+		'base-url' => array(
+			'_' => 'عنوان URL الأساسي',
+			'recommendation' => 'التوصية التلقائية: <kbd>%s</kbd>',
+		),
+		'closed_registration_message' => 'الرسالة عند إغلاق التسجيل',
+		'cookie-duration' => array(
+			'help' => 'بالثواني',
+			'number' => 'مدة بقاء تسجيل الدخول',
+		),
+		'default_closed_registration_message' => 'لا يقبل هذا الخادم تسجيلات جديدة في الوقت الحالي.',
+		'force_email_validation' => 'فرض التحقق من عنوان البريد الإلكتروني',
+		'instance-name' => 'اسم المثيل',
+		'internal-host-allowlist' => array(
+			'_' => 'قائمة السماح للمضيفين الداخليين',
+			'help' => 'إدخال واحد في كل سطر:<ul><li><code>host:port</code>. على سبيل المثال <code>127.0.0.1:8080</code> أو <code>rss-bridge:80</code></li><li>تدوين CIDR. على سبيل المثال <code>0.0.0.0/0</code> للسماح بأي IPv4، و<code>::/0</code> للسماح بأي IPv6</li><li><code>*</code> للسماح بأي مضيف (غير آمن)</li></ul>',
+		),
+		'max-categories' => 'الحد الأقصى لعدد الفئات لكل مستخدم',
+		'max-feeds' => 'الحد الأقصى لعدد الخلاصات لكل مستخدم',
+		'override-by-env-var' => 'يتم تعيين هذا الإعداد بواسطة متغير البيئة <kbd>%s</kbd>.',
+		'registration' => array(
+			'number' => 'الحد الأقصى لعدد الحسابات',
+			'select' => array(
+				'label' => 'نموذج التسجيل',
+				'option' => array(
+					'noform' => 'معطل: لا يوجد نموذج تسجيل',
+					'nolimit' => 'مفعل: لا يوجد حد لعدد الحسابات',
+					'setaccountsnumber' => 'تعيين الحد الأقصى لعدد الحسابات',
+				),
+			),
+			'status' => array(
+				'disabled' => 'النموذج معطل',
+				'enabled' => 'النموذج مفعل',
+			),
+			'title' => 'نموذج تسجيل المستخدم',
+		),
+		'sensitive-parameter' => 'معلمة حساسة. حررها يدويًا في <kbd>./data/config.php</kbd>',
+		'tos' => array(
+			'disabled' => 'غير مقدمة',
+			'enabled' => '<a href="./?a=tos">مفعلة</a>',
+			'help' => 'كيفية <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">تفعيل شروط الخدمة</a>',
+		),
+		'websub' => array(
+			'help' => 'حول <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',
+		),
+	),
+	'update' => array(
+		'_' => 'تحديث FreshRSS',
+		'apply' => 'بدء التحديث',
+		'changelog' => 'سجل التغييرات',
+		'check' => 'التحقق من وجود تحديثات جديدة',
+		'copiedFromURL' => 'تم نسخ update.php من %s إلى ./data',
+		'current_version' => 'الإصدار المثبت الحالي',
+		'last' => 'آخر فحص',
+		'loading' => 'جارٍ التحديث…',
+		'none' => 'لا يتوفر تحديث',
+		'releaseChannel' => array(
+			'_' => 'قناة الإصدار',
+			'edge' => 'إصدار متجدد (“edge”)',
+			'latest' => 'إصدار مرقم (“latest”)',
+		),
+		'title' => 'تحديث FreshRSS',
+		'viaGit' => 'بدأ التحديث عبر git و GitHub.com',
+	),
+	'user' => array(
+		'admin' => 'المسؤول',
+		'article_count' => 'المقالات',
+		'back_to_manage' => '← العودة إلى قائمة المستخدمين',
+		'create' => 'إنشاء مستخدم جديد',
+		'database_size' => 'حجم قاعدة البيانات',
+		'email' => 'عنوان البريد الإلكتروني',
+		'enabled' => 'مفعل',
+		'feed_count' => 'الخلاصات',
+		'is_admin' => 'مسؤول',
+		'language' => 'اللغة',
+		'last_user_activity' => 'آخر نشاط للمستخدم',
+		'list' => 'قائمة المستخدمين',
+		'number' => 'تم إنشاء %d حساب',
+		'numbers' => 'تم إنشاء %d حسابات',
+		'password_form' => 'كلمة المرور<br /><small>(لطريقة تسجيل الدخول عبر نموذج الويب)</small>',
+		'password_format' => '7 أحرف على الأقل',
+		'title' => 'إدارة المستخدمين',
+		'username' => 'اسم المستخدم',
+	),
+);

+ 33 - 0
app/i18n/ar/api.php

@@ -0,0 +1,33 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its   *
+ * state. When there is no comment, it means the entry is fully translated.   *
+ * The recognized comments are (comment matching is case-insensitive):        *
+ *   + TODO: the entry has never been translated.                             *
+ *   + DIRTY: the entry has been translated but needs to be updated.          *
+ *   + IGNORE: the entry does not need to be translated.                      *
+ * When a comment is not recognized, it is discarded.                         *
+ ******************************************************************************/
+
+return array(
+	'information' => array(
+		'address' => 'عنوان API الخاص بك:',
+		'output' => array(
+			'encoding-support' => '⚠️ تحذير: لا يوجد دعم لـ <code>%2F</code>، قد لا تعمل بعض العملاء!',
+			'invalid-configuration' => '⚠️ تحذير: من المحتمل أن يكون عنوان URL الأساسي غير صالح في ./data/config.php',
+			'pass' => '✔️ ناجح',
+			'unknown-error' => '❌ ',	// IGNORE
+		),
+		'test' => array(
+			'fever' => 'اختبار إعدادات Fever API:',
+			'greader' => 'اختبار إعدادات Google Reader API:',
+		),
+		'title' => array(
+			'_' => 'نقاط نهاية FreshRSS API',
+			'extension' => 'API للإضافات',
+			'fever' => 'API المتوافق مع Fever',
+			'greader' => 'API المتوافق مع Google Reader',
+		),
+	),
+);

+ 384 - 0
app/i18n/ar/conf.php

@@ -0,0 +1,384 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its   *
+ * state. When there is no comment, it means the entry is fully translated.   *
+ * The recognized comments are (comment matching is case-insensitive):        *
+ *   + TODO: the entry has never been translated.                             *
+ *   + DIRTY: the entry has been translated but needs to be updated.          *
+ *   + IGNORE: the entry does not need to be translated.                      *
+ * When a comment is not recognized, it is discarded.                         *
+ ******************************************************************************/
+
+return array(
+	'archiving' => array(
+		'_' => 'الأرشفة',
+		'exception' => 'استثناء من الحذف',
+		'help' => 'تتوفر خيارات إضافية في إعدادات كل خلاصة على حدة',
+		'keep_favourites' => 'عدم حذف المفضلة أبدا',
+		'keep_labels' => 'عدم حذف التسميات أبدا',
+		'keep_max' => 'الحد الأقصى لعدد المقالات المحفوظة لكل خلاصة',
+		'keep_min_by_feed' => 'الحد الأدنى لعدد المقالات المحفوظة لكل خلاصة',
+		'keep_period' => 'الحد الأقصى لعمر المقالات المحفوظة',
+		'keep_unreads' => 'عدم حذف المقالات غير المقروءة أبدا',
+		'maintenance' => 'الصيانة',
+		'optimize' => 'تحسين قاعدة البيانات',
+		'optimize_help' => 'التشغيل من حين لآخر لتقليل حجم قاعدة البيانات',
+		'policy' => 'سياسة الحذف',
+		'policy_warning' => 'إذا لم تُحدد سياسة حذف، فسيتم الاحتفاظ بكل مقال.',
+		'purge_now' => 'الحذف الآن',
+		'title' => 'الأرشفة',
+		'ttl' => 'عدم التحديث التلقائي بشكل أكثر تكرارا من',
+	),
+	'display' => array(
+		'_' => 'العرض',
+		'article' => array(
+			'authors_date' => array(
+				'_' => 'المؤلفون والتاريخ',
+				'both' => 'في الترويسة والتذييل',
+				'footer' => 'في التذييل',
+				'header' => 'في الترويسة',
+				'none' => 'لا شيء',
+			),
+			'feed_name' => array(
+				'above_title' => 'فوق العنوان/الوسوم',
+				'none' => 'لا شيء',
+				'with_authors' => 'في صف المؤلفين والتاريخ',
+			),
+			'feed_title' => 'عنوان الخلاصة',
+			'icons' => array(
+				'_' => 'موضع أيقونات المقال<br /><small>(عرض القراءة فقط)</small>',
+				'above_title' => 'فوق العنوان',
+				'with_authors' => 'في صف المؤلفين والتاريخ',
+			),
+			'tags' => array(
+				'_' => 'الوسوم',
+				'both' => 'في الترويسة والتذييل',
+				'footer' => 'في التذييل',
+				'header' => 'في الترويسة',
+				'none' => 'لا شيء',
+			),
+			'tags_max' => array(
+				'_' => 'الحد الأقصى لعدد الوسوم المعروضة',
+				'help' => '0 يعني: عرض جميع الوسوم وعدم طيها',
+			),
+		),
+		'darkMode' => array(
+			'_' => 'الوضع الداكن التلقائي',
+			'auto' => 'تلقائي',
+			'help' => 'للسمات المتوافقة فقط',
+			'no' => 'لا',
+		),
+		'display_enclosures' => 'عرض المرفقات',
+		'headline' => array(
+			'articles_header_footer' => 'المقالات: الترويسة/التذييل',
+		),
+		'icon' => array(
+			'bottom_line' => 'السطر السفلي',
+			'display_authors' => 'المؤلفون',
+			'entry' => 'أيقونات المقال',
+			'publication_date' => 'تاريخ النشر',
+			'related_tags' => 'وسوم المقال',
+			'sharing' => 'المشاركة',
+			'summary' => 'الملخص',
+			'top_line' => 'السطر العلوي',
+		),
+		'language' => 'اللغة',
+		'notif_html5' => array(
+			'seconds' => 'ثوانٍ (0 يعني عدم وجود مهلة)',
+			'timeout' => 'مهلة إشعارات HTML5',
+		),
+		'show_nav_buttons' => 'عرض أزرار التنقل',
+		'show_title_unread' => 'عرض عدد المقالات غير المقروءة في العنوان',
+		'show_unread_count' => array(
+			'_' => 'عرض أعداد غير المقروءة في الشريط الجانبي',
+			'all' => 'لجميع التصنيفات والخلاصات',
+			'important' => 'للخلاصات المهمة فقط',
+			'important_locked' => 'تعرض الخلاصات المهمة دائما عدد المقالات غير المقروءة فيها.',
+			'none' => 'أبدا',
+		),
+		'sidebar_hidden_by_default' => 'إخفاء الشريط الجانبي افتراضيا',
+		'theme' => array(
+			'_' => 'السمة',
+			'deprecated' => array(
+				'_' => 'مهملة',
+				'description' => 'لم تعد هذه السمة مدعومة ولن تكون متاحة بعد الآن في <a href="https://freshrss.github.io/FreshRSS/en/users/05_Configuration.html#theme" target="_blank">إصدار مستقبلي من FreshRSS</a>',
+			),
+		),
+		'theme_not_available' => 'السمة “%s” لم تعد متاحة. يرجى اختيار سمة أخرى.',
+		'thumbnail' => array(
+			'label' => 'الصورة المصغرة',
+			'landscape' => 'أفقي',
+			'none' => 'لا شيء',
+			'portrait' => 'عمودي',
+			'square' => 'مربع',
+		),
+		'timezone' => 'المنطقة الزمنية',
+		'title' => 'العرض',
+		'website' => array(
+			'full' => 'الأيقونة والاسم',
+			'icon' => 'الأيقونة فقط',
+			'label' => 'الموقع الإلكتروني',
+			'name' => 'الاسم فقط',
+			'none' => 'لا شيء',
+		),
+		'width' => array(
+			'content' => 'عرض المحتوى',
+			'large' => 'واسع',
+			'medium' => 'متوسط',
+			'no_limit' => 'العرض الكامل',
+			'thin' => 'ضيق',
+		),
+	),
+	'logs' => array(
+		'loglist' => array(
+			'level' => 'مستوى السجل',
+			'message' => 'رسالة السجل',
+			'timestamp' => 'الطابع الزمني',
+		),
+		'pagination' => array(
+			'first' => 'الأول',
+			'last' => 'الأخير',
+			'next' => 'التالي',
+			'previous' => 'السابق',
+		),
+	),
+	'mark_read_button' => array(
+		'_' => 'زر “تعليم الكل كمقروء”',
+		'big' => 'كبير',
+		'none' => 'لا شيء',
+		'small' => 'صغير',
+	),
+	'notification' => array(
+		'html5_enable_notif' => 'تفعيل الإشعارات',
+	),
+	'notification_timeout' => array(
+		'bad' => array(
+			'label' => 'عرض شريط التحذير',
+			'seconds' => 'ثوانٍ (واحدة على الأقل)',
+		),
+		'good' => array(
+			'label' => 'عرض شريط التأكيد',
+			'seconds' => 'ثوانٍ (0 يعني عدم العرض)',
+		),
+	),
+	'privacy' => array(
+		'_' => 'الخصوصية',
+		'retrieve_extension_list' => 'جلب قائمة الإضافات',
+		'send_referrer_allowlist' => 'المواقع المسموح لها بمعرفة عنوان خادمك (%s)',
+	),
+	'profile' => array(
+		'_' => 'إدارة الملف الشخصي',
+		'api' => array(
+			'_' => 'الوصول الخارجي عبر API',
+			'api_not_set' => 'لم تُعيّن كلمة مرور API',
+			'api_set' => 'عُيّنت كلمة مرور API',
+			'check_link' => 'التحقق من حالة API عبر: <kbd><a href="../api/" target="_blank">%s</a></kbd>',
+			'disabled' => 'الوصول عبر API معطل.',
+			'documentation_link' => 'راجع <a href="https://freshrss.github.io/FreshRSS/en/users/06_Mobile_access.html#access-via-mobile-app" target="_blank">الوثائق وقائمة التطبيقات المعروفة</a>',
+			'help' => 'راجع <a href="https://freshrss.github.io/FreshRSS/en/users/06_Mobile_access.html#access-via-mobile-app" target=_blank>الوثائق</a>',
+			'security_warning' => 'استخدم HTTPS. تُرسل كلمة مرور API بنص واضح وقد تظهر في سجلات الخادم إذا أُرسلت عبر GET.',
+		),
+		'change_password' => 'تغيير كلمة المرور',
+		'confirm_new_password' => 'تأكيد كلمة المرور الجديدة',
+		'current_password' => 'كلمة المرور الحالية<br /><small>(لطريقة تسجيل الدخول عبر نموذج الويب)</small>',
+		'delete' => array(
+			'_' => 'حذف الحساب',
+			'warn' => 'سيتم حذف حسابك وجميع البيانات المرتبطة به.',
+		),
+		'email' => 'عنوان البريد الإلكتروني',
+		'new_password' => 'كلمة المرور الجديدة',
+		'password_api' => 'كلمة مرور API<br /><small>(مثال: لتطبيقات الجوال)</small>',
+		'password_format' => '7 أحرف على الأقل',
+		'title' => 'الملف الشخصي',
+	),
+	'query' => array(
+		'_' => 'استعلامات المستخدم',
+		'create' => 'إنشاء استعلام مستخدم جديد',
+		'deprecated' => 'لم يعد هذا الاستعلام صالحا. لقد حُذف التصنيف أو الخلاصة المشار إليها.',
+		'description' => 'الوصف',
+		'filter' => array(
+			'_' => 'المرشح المطبق:',
+			'categories' => 'العرض حسب التصنيف',
+			'feeds' => 'العرض حسب الخلاصة',
+			'include_article_tags_label' => 'تضمين وسوم المقالات من الخلاصات',
+			'include_user_labels_label' => 'تضمين تسميات المستخدم، مع البادئة:',
+			'order' => 'الفرز حسب التاريخ',
+			'search' => 'التعبير',
+			'shareOpml' => 'تفعيل المشاركة عبر OPML للتصنيفات والخلاصات المقابلة',
+			'shareRss' => 'تفعيل المشاركة عبر HTML &amp; RSS',
+			'state' => 'الحالة',
+			'tags' => 'العرض حسب التسمية',
+			'type' => 'النوع',
+		),
+		'get_A' => 'عرض جميع الخلاصات، بما فيها المعروضة في تصنيفها',
+		'get_Z' => 'عرض جميع الخلاصات، بما فيها المؤرشفة',
+		'get_all' => 'عرض جميع المقالات',
+		'get_all_labels' => 'عرض المقالات ذات أي تسمية',
+		'get_category' => 'عرض تصنيف “%s”',
+		'get_favorite' => 'عرض المقالات المفضلة',
+		'get_feed' => 'عرض خلاصة “%s”',
+		'get_important' => 'عرض المقالات من الخلاصات المهمة',
+		'get_label' => 'عرض المقالات ذات التسمية “%s”',
+		'help' => 'راجع <a href="https://freshrss.github.io/FreshRSS/en/users/user_queries.html" target="_blank">وثائق استعلامات المستخدم وإعادة المشاركة عبر HTML / RSS / OPML</a>.',
+		'image_url' => 'URL الصورة',
+		'name' => 'الاسم',
+		'no_filter' => 'بدون مرشح',
+		'no_queries' => array(
+			'_' => 'لم تُحفظ أي استعلامات مستخدم بعد.',
+			'help' => 'راجع <a href="https://freshrss.github.io/FreshRSS/en/users/user_queries.html" target="_blank">الوثائق</a>',
+		),
+		'number' => 'الاستعلام رقم %d',
+		'order_asc' => 'عرض المقالات الأقدم أولا',
+		'order_desc' => 'عرض المقالات الأحدث أولا',
+		'search' => 'البحث عن “%s”',
+		'share' => array(
+			'_' => 'مشاركة هذا الاستعلام عبر رابط',
+			'disabled' => array(
+				'_' => 'معطلة',
+				'title' => 'المشاركة',
+			),
+			'greader' => 'رابط قابل للمشاركة إلى GReader JSON',
+			'help' => 'امنح هذا الرابط إذا أردت مشاركة هذا الاستعلام مع أي شخص',
+			'html' => 'رابط قابل للمشاركة إلى صفحة HTML',
+			'opml' => 'رابط قابل للمشاركة إلى قائمة OPML للخلاصات',
+			'rss' => 'رابط قابل للمشاركة إلى خلاصة RSS',
+		),
+		'state_all' => 'عرض جميع المقالات',
+		'state_favorite' => 'عرض المقالات المفضلة',
+		'state_not_favorite' => 'عرض المقالات غير المفضلة',
+		'state_read' => 'عرض المقالات المقروءة',
+		'state_read_favorite' => 'عرض المقالات المفضلة المقروءة',
+		'state_read_not_favorite' => 'عرض المقالات غير المفضلة المقروءة',
+		'state_unread' => 'عرض المقالات غير المقروءة',
+		'state_unread_favorite' => 'عرض المقالات المفضلة غير المقروءة',
+		'state_unread_not_favorite' => 'عرض المقالات غير المفضلة غير المقروءة',
+		'title' => 'استعلامات المستخدم',
+	),
+	'reading' => array(
+		'_' => 'القراءة',
+		'after_onread' => 'بعد “تعليم الكل كمقروء”،',
+		'always_show_favorites' => 'عرض جميع المقالات في المفضلة افتراضيا',
+		'apply_to_individual_feed' => 'ينطبق على الخلاصات كل على حدة',
+		'articles_per_page' => 'عدد المقالات في كل صفحة',
+		'auto_load_more' => 'تحميل المزيد من المقالات في أسفل الصفحة',
+		'auto_remove_article' => 'إخفاء المقالات بعد القراءة',
+		'confirm_enabled' => 'عرض مربع حوار للتأكيد عند إجراءات “تعليم الكل كمقروء”',
+		'display_articles_unfolded' => 'عرض المقالات مفتوحة افتراضيا',
+		'display_categories_unfolded' => 'التصنيفات المراد فتحها',
+		'headline' => array(
+			'articles' => 'المقالات: فتح/إغلاق',
+			'categories' => 'التنقل الأيسر: التصنيفات',
+			'mark_as_read' => 'تعليم المقال كمقروء',
+			'misc' => 'متنوعات',
+			'view' => 'العرض',
+		),
+		'hide_read_feeds' => 'إخفاء التصنيفات والخلاصات التي لا تحتوي على مقالات غير مقروءة (لا يعمل مع إعداد “عرض جميع المقالات”)',
+		'img_with_lazyload' => 'استخدام وضع <em>lazy load</em> لتحميل الصور',
+		'jump_next' => 'الانتقال إلى العنصر الشقيق غير المقروء التالي',
+		'mark_updated_article_unread' => 'تعليم المقالات المحدثة كغير مقروءة',
+		'number_divided_when_reader' => 'القسمة على 2 في عرض القراءة.',
+		'read' => array(
+			'article_open_on_website' => 'عند فتح المقال على موقعه الأصلي',
+			'article_viewed' => 'عند عرض المقال',
+			'focus' => 'عند التركيز عليه (باستثناء الخلاصات المهمة)',
+			'keep_max_n_unread' => 'الحد الأقصى لعدد المقالات المحفوظة كغير مقروءة',
+			'scroll' => 'أثناء التمرير (باستثناء الخلاصات المهمة)',
+			'upon_gone' => 'عندما لا يعود موجودا في خلاصة الأخبار المصدر',
+			'upon_reception' => 'عند استلام المقال',
+			'when' => 'تعليم مقال كمقروء…',
+			'when_same_guid_in_category' => 'إذا كان هناك GUID مطابق موجود بالفعل ضمن أحدث <i>n</i> مقال في التصنيف',
+			'when_same_title_in_category' => 'إذا كان هناك عنوان مطابق موجود بالفعل ضمن أحدث <i>n</i> مقال في التصنيف',
+			'when_same_title_in_feed' => 'إذا كان هناك عنوان مطابق موجود بالفعل ضمن أحدث <i>n</i> مقال في الخلاصة',
+		),
+		'show' => array(
+			'_' => 'المقالات المراد عرضها',
+			'active_category' => 'التصنيف النشط',
+			'adaptive' => 'عرض المقالات غير المقروءة إن وجدت، وإلا عرض جميع المقالات',
+			'all_articles' => 'عرض جميع المقالات',
+			'all_categories' => 'جميع التصنيفات',
+			'no_category' => 'بدون تصنيف',
+			'remember_categories' => 'تذكر التصنيفات المفتوحة',
+			'unread' => 'عرض غير المقروءة',
+			'unread_or_favorite' => 'عرض غير المقروءة والمفضلة',
+		),
+		'show_fav_unread_help' => 'ينطبق أيضا على التسميات',
+		'sides_close_article' => 'النقر خارج منطقة نص المقال يغلق المقال',
+		'star' => array(
+			'when' => 'تعليم مقال كمفضل…',
+		),
+		'sticky_post' => 'تثبيت المقال في الأعلى عند فتحه',
+		'sticky_sort' => 'الاحتفاظ بترتيب الفرز المخصص أثناء التنقل',
+		'sticky_sort_help' => 'يحدد ما إذا كان آخر ترتيب فرز مخصص يبقى فعالا أم أن كل تصنيف أو خلاصة يستخدم دائما إعداده الافتراضي أو العام.',
+		'title' => 'القراءة',
+		'view' => array(
+			'default' => 'العرض الافتراضي',
+			'global' => 'العرض الشامل',
+			'normal' => 'العرض العادي',
+			'reader' => 'عرض القراءة',
+		),
+	),
+	'sharing' => array(
+		'_' => 'المشاركة',
+		'add' => 'إضافة طريقة مشاركة',
+		'bluesky' => 'Bluesky',	// IGNORE
+		'deprecated' => 'هذه الخدمة مهملة وستتم إزالتها من FreshRSS في <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Open documentation for more information" target="_blank">إصدار مستقبلي</a>.',
+		'diaspora' => 'Diaspora*',	// IGNORE
+		'email' => 'البريد الإلكتروني',
+		'facebook' => 'Facebook',	// IGNORE
+		'more_information' => 'مزيد من المعلومات',
+		'print' => 'طباعة',
+		'raindrop' => 'Raindrop.io',	// IGNORE
+		'remove' => 'إزالة طريقة مشاركة',
+		'shaarli' => 'Shaarli',	// IGNORE
+		'share_name' => 'اسم المشاركة المراد عرضه',
+		'share_url' => 'URL المشاركة المراد استخدامه',
+		'title' => 'المشاركة',
+		'twitter' => 'Twitter',	// IGNORE
+		'wallabag' => 'wallabag',	// IGNORE
+	),
+	'shortcut' => array(
+		'_' => 'الاختصارات',
+		'article_action' => 'إجراءات المقال',
+		'auto_share' => 'مشاركة',
+		'auto_share_help' => 'إذا كان هناك وضع مشاركة واحد فقط، فسيتم استخدامه. وإلا، يمكن الوصول إلى الأوضاع برقمها.',
+		'close_menus' => 'إغلاق القوائم',
+		'collapse_article' => 'طي',
+		'first_article' => 'فتح المقال الأول',
+		'focus_search' => 'الوصول إلى مربع البحث',
+		'global_view' => 'التبديل إلى العرض الشامل',
+		'help' => 'عرض الوثائق',
+		'javascript' => 'يجب تفعيل JavaScript لاستخدام الاختصارات',
+		'last_article' => 'فتح المقال الأخير',
+		'load_more' => 'تحميل المزيد من المقالات',
+		'mark_favorite' => 'تبديل المفضلة',
+		'mark_read' => 'تبديل القراءة',
+		'navigation' => 'التنقل',
+		'navigation_help' => 'مع معدّل <kbd>⇧ Shift</kbd>، تنطبق اختصارات التنقل على الخلاصات.<br/>ومع معدّل <kbd>Alt ⎇</kbd>، تنطبق اختصارات التنقل على التصنيفات.',
+		'navigation_no_mod_help' => 'اختصارات التنقل التالية لا تدعم المعدّلات.',
+		'next_article' => 'فتح المقال التالي',
+		'next_unread_article' => 'فتح المقال غير المقروء التالي',
+		'non_standard' => 'قد لا تعمل بعض المفاتيح (<kbd>%s</kbd>) كاختصارات.',
+		'normal_view' => 'التبديل إلى العرض العادي',
+		'other_action' => 'إجراءات أخرى',
+		'previous_article' => 'فتح المقال السابق',
+		'reading_view' => 'التبديل إلى عرض القراءة',
+		'rss_view' => 'الفتح كخلاصة RSS',
+		'see_on_website' => 'العرض على الموقع الأصلي',
+		'shift_for_all_read' => '+ <kbd>Alt ⎇</kbd> لتعليم المقالات السابقة كمقروءة<br />+ <kbd>⇧ Shift</kbd> لتعليم جميع المقالات كمقروءة',
+		'skip_next_article' => 'تركيز التالي دون فتحه',
+		'skip_previous_article' => 'تركيز السابق دون فتحه',
+		'title' => 'الاختصارات',
+		'toggle_aside' => 'تبديل الشريط الجانبي',
+		'toggle_media' => 'تشغيل/إيقاف الوسائط مؤقتا',
+		'user_filter' => 'الوصول إلى استعلامات المستخدم',
+		'user_filter_help' => 'إذا كان هناك استعلام مستخدم واحد فقط، فسيتم استخدامه. وإلا، يمكن الوصول إلى الاستعلامات برقمها.',
+		'views' => 'طرق العرض',
+	),
+	'user' => array(
+		'articles_and_size' => '%s مقال (%s)',
+		'current' => 'المستخدم الحالي',
+		'is_admin' => 'هو مسؤول',
+		'users' => 'المستخدمون',
+	),
+);

+ 152 - 0
app/i18n/ar/feedback.php

@@ -0,0 +1,152 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its   *
+ * state. When there is no comment, it means the entry is fully translated.   *
+ * The recognized comments are (comment matching is case-insensitive):        *
+ *   + TODO: the entry has never been translated.                             *
+ *   + DIRTY: the entry has been translated but needs to be updated.          *
+ *   + IGNORE: the entry does not need to be translated.                      *
+ * When a comment is not recognized, it is discarded.                         *
+ ******************************************************************************/
+
+return array(
+	'access' => array(
+		'denied' => 'ليس لديك إذن للوصول إلى هذه الصفحة',
+		'not_found' => 'أنت تبحث عن صفحة غير موجودة',
+	),
+	'admin' => array(
+		'optimization_complete' => 'اكتمل التحسين',
+	),
+	'api' => array(
+		'password' => array(
+			'failed' => 'لا يمكن تعديل كلمة المرور الخاصة بك',
+			'updated' => 'تم تعديل كلمة المرور الخاصة بك',
+		),
+	),
+	'auth' => array(
+		'login' => array(
+			'invalid' => 'بيانات تسجيل الدخول غير صالحة',
+			'success' => 'أنت متصل الآن',
+		),
+		'logout' => array(
+			'success' => 'تم تسجيل خروجك',
+		),
+	),
+	'conf' => array(
+		'error' => 'حدث خطأ أثناء حفظ الإعدادات',
+		'query_created' => 'تم إنشاء الاستعلام “%s”.',
+		'shortcuts_updated' => 'تم تحديث الاختصارات بنجاح',
+		'updated' => 'تم تحديث الإعدادات بنجاح',
+	),
+	'extensions' => array(
+		'already_enabled' => '%s مفعّل بالفعل',
+		'cannot_remove' => 'لا يمكن إزالة %s',
+		'disable' => array(
+			'ko' => 'لا يمكن تعطيل %s. <a href="%s">راجع سجلات FreshRSS</a> لمزيد من التفاصيل.',
+			'ok' => 'تم تعطيل %s الآن',
+		),
+		'enable' => array(
+			'ko' => 'لا يمكن تفعيل %s. <a href="%s">راجع سجلات FreshRSS</a> لمزيد من التفاصيل.',
+			'ok' => 'تم تفعيل %s الآن',
+		),
+		'invalid_view_mode' => 'وضع العرض “%s” غير صالح! تم الرجوع إلى “العرض العادي”.',
+		'no_access' => 'ليس لديك حق الوصول إلى %s',
+		'not_enabled' => '%s غير مفعّل',
+		'not_found' => '%s غير موجود',
+		'removed' => 'تمت إزالة %s',
+	),
+	'import_export' => array(
+		'export_no_zip_extension' => 'امتداد ZIP غير موجود على الخادم الخاص بك. يرجى محاولة تصدير الملفات واحدًا تلو الآخر.',
+		'feeds_imported' => 'تم استيراد خلاصاتك بنجاح. إذا انتهيت من الاستيراد، يمكنك الآن النقر على زر <i>تحديث الخلاصات</i>.',
+		'feeds_imported_with_errors' => 'تم استيراد خلاصاتك، ولكن حدثت بعض الأخطاء. إذا انتهيت من الاستيراد، يمكنك الآن النقر على زر <i>تحديث الخلاصات</i>.',
+		'file_cannot_be_uploaded' => 'لا يمكن رفع الملف!',
+		'no_zip_extension' => 'امتداد ZIP غير موجود على الخادم الخاص بك.',
+		'zip_error' => 'حدث خطأ أثناء معالجة ZIP.',
+	),
+	'profile' => array(
+		'error' => 'لا يمكن تعديل ملفك الشخصي',
+		'passwords_dont_match' => 'كلمتا المرور غير متطابقتين',
+		'updated' => 'تم تعديل ملفك الشخصي بنجاح',
+	),
+	'sub' => array(
+		'actualize' => 'جارٍ التحديث',
+		'articles' => array(
+			'marked_read' => 'تم تعليم المقالات المحددة كمقروءة.',
+			'marked_unread' => 'تم تعليم المقالات كغير مقروءة.',
+		),
+		'category' => array(
+			'created' => 'تم إنشاء التصنيف %s بنجاح.',
+			'deleted' => 'تم حذف التصنيف بنجاح.',
+			'emptied' => 'تم إفراغ التصنيف',
+			'error' => 'لا يمكن تحديث التصنيف',
+			'name_exists' => 'اسم التصنيف موجود بالفعل.',
+			'no_id' => 'يجب تحديد معرّف التصنيف.',
+			'no_name' => 'لا يمكن أن يكون اسم التصنيف فارغًا.',
+			'not_delete_default' => 'لا يمكنك حذف التصنيف الافتراضي!',
+			'not_exist' => 'التصنيف غير موجود!',
+			'over_max' => 'لقد وصلت إلى الحد الأقصى من التصنيفات (%d)',
+			'updated' => 'تم تحديث التصنيف بنجاح.',
+		),
+		'feed' => array(
+			'actualized' => 'تم تحديث <em>%s</em> بنجاح',
+			'actualizeds' => 'تم تحديث خلاصات RSS بنجاح',
+			'added' => 'تمت إضافة خلاصة RSS <em>%s</em> بنجاح',
+			'already_subscribed' => 'أنت مشترك بالفعل في <em>%s</em>',
+			'cache_cleared' => 'تم مسح ذاكرة التخزين المؤقت لـ <em>%s</em>',
+			'deleted' => 'تم حذف الخلاصة بنجاح',
+			'error' => 'لا يمكن تحديث الخلاصة',
+			'favicon' => array(
+				'too_large' => 'الأيقونة المرفوعة كبيرة جدًا. الحد الأقصى لحجم الملف هو <em>%s</em>.',
+				'unsupported_format' => 'تنسيق ملف الصورة غير مدعوم!',
+			),
+			'internal_problem' => 'تعذرت إضافة خلاصة الأخبار. <a href="%s">راجع سجلات FreshRSS</a> لمزيد من التفاصيل. يمكنك محاولة الإضافة القسرية بإضافة <code>#force_feed</code> إلى الرابط.',
+			'invalid_url' => 'الرابط <em>%s</em> غير صالح',
+			'n_actualized' => 'تم تحديث %d خلاصة',
+			'n_entries_deleted' => 'تم حذف %d مقال',
+			'no_refresh' => 'لا توجد خلاصات لتحديثها',
+			'not_added' => 'تعذرت إضافة <em>%s</em>',
+			'not_found' => 'تعذر العثور على الخلاصة',
+			'over_max' => 'لقد وصلت إلى الحد الأقصى من الخلاصات (%d)',
+			'reloaded' => 'تمت إعادة تحميل <em>%s</em>',
+			'selector_preview' => array(
+				'http_error' => 'فشل تحميل محتوى الموقع.',
+				'no_entries' => 'لا توجد مقالات في هذه الخلاصة. تحتاج إلى مقال واحد على الأقل لإنشاء معاينة.',
+				'no_feed' => 'خطأ داخلي (تعذر العثور على الخلاصة).',
+				'no_result' => 'لم يطابق المحدد أي شيء. كبديل، سيتم عرض نص الخلاصة الأصلي بدلًا من ذلك.',
+				'selector_empty' => 'المحدد فارغ. تحتاج إلى تعريف محدد لإنشاء معاينة.',
+			),
+			'updated' => 'تم تحديث الخلاصة بنجاح',
+		),
+		'purge_completed' => 'اكتمل التطهير (تم حذف %d مقال)',
+	),
+	'tag' => array(
+		'created' => 'تم إنشاء التسمية “%s” بنجاح.',
+		'error' => 'تعذر تحديث التسمية!',
+		'name_exists' => 'اسم التسمية موجود بالفعل.',
+		'renamed' => 'تمت إعادة تسمية التسمية “%s” إلى “%s”.',
+		'updated' => 'تم تحديث التسمية بنجاح.',
+	),
+	'update' => array(
+		'can_apply' => 'يتوفر تحديث لـ FreshRSS: <strong>الإصدار %s</strong>.',
+		'error' => 'واجهت عملية التحديث خطأ: %s',
+		'file_is_nok' => 'يتوفر تحديث لـ FreshRSS (<strong>الإصدار %s</strong>)، ولكن تحقق من الأذونات على مجلد <em>%s</em>. يجب أن يتمتع خادم HTTP بإذن الكتابة',
+		'finished' => 'اكتمل التحديث!',
+		'none' => 'لا يتوفر أي تحديث',
+		'server_not_found' => 'تعذر العثور على خادم التحديث. [%s]',
+	),
+	'user' => array(
+		'created' => array(
+			'_' => 'تم إنشاء المستخدم %s بنجاح',
+			'error' => 'لا يمكن إنشاء المستخدم %s',
+		),
+		'deleted' => array(
+			'_' => 'تم حذف المستخدم %s بنجاح',
+			'error' => 'لا يمكن حذف المستخدم %s',
+		),
+		'updated' => array(
+			'_' => 'تم تحديث المستخدم %s بنجاح',
+			'error' => 'لم يتم تحديث المستخدم %s',
+		),
+	),
+);

+ 376 - 0
app/i18n/ar/gen.php

@@ -0,0 +1,376 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its   *
+ * state. When there is no comment, it means the entry is fully translated.   *
+ * The recognized comments are (comment matching is case-insensitive):        *
+ *   + TODO: the entry has never been translated.                             *
+ *   + DIRTY: the entry has been translated but needs to be updated.          *
+ *   + IGNORE: the entry does not need to be translated.                      *
+ * When a comment is not recognized, it is discarded.                         *
+ ******************************************************************************/
+
+return array(
+	'action' => array(
+		'actualize' => 'تحديث الخلاصات',
+		'add' => 'إضافة',
+		'back_to_rss_feeds' => '← العودة إلى خلاصات RSS',
+		'cancel' => 'إلغاء',
+		'close' => 'إغلاق',
+		'create' => 'إنشاء',
+		'delete_all_feeds' => 'حذف كل الخلاصات',
+		'delete_errored_feeds' => 'حذف الخلاصات التي بها أخطاء',
+		'delete_muted_feeds' => 'حذف الخلاصات المكتومة',
+		'demote' => 'خفض الرتبة',
+		'disable' => 'تعطيل',
+		'download' => 'تنزيل',
+		'empty' => 'إفراغ',
+		'enable' => 'تفعيل',
+		'export' => 'تصدير',
+		'filter' => 'تصفية',
+		'import' => 'استيراد',
+		'load_default_shortcuts' => 'تحميل الاختصارات الافتراضية',
+		'manage' => 'إدارة',
+		'mark_read' => 'وضع علامة كمقروء',
+		'menu' => array(
+			'open' => 'فتح القائمة',
+		),
+		'nav_buttons' => array(
+			'next' => 'المقال التالي',
+			'prev' => 'المقال السابق',
+			'up' => 'الانتقال إلى الأعلى',
+		),
+		'open_url' => 'فتح URL',
+		'promote' => 'ترقية',
+		'purge' => 'تطهير',
+		'refresh_opml' => 'تحديث OPML',
+		'remove' => 'إزالة',
+		'rename' => 'إعادة تسمية',
+		'see_website' => 'زيارة الموقع',
+		'submit' => 'إرسال',
+		'truncate' => 'حذف كل المقالات',
+		'update' => 'تحديث',
+	),
+	'auth' => array(
+		'accept_tos' => 'أوافق على <a href="%s">شروط الخدمة</a>.',
+		'email' => 'عنوان البريد الإلكتروني',
+		'keep_logged_in' => 'إبقائي مسجل الدخول <small>(%s أيام)</small>',
+		'login' => 'تسجيل الدخول',
+		'logout' => 'تسجيل الخروج',
+		'password' => array(
+			'_' => 'كلمة المرور',
+			'format' => '<small>7 أحرف على الأقل</small>',
+		),
+		'reauth' => array(
+			'header' => 'يلزم إعادة المصادقة',
+			'tip' => 'لن يُطلب منك تسجيل الدخول مرة أخرى لمدة <u>%d دقيقة</u>',
+			'title' => 'إعادة المصادقة',
+		),
+		'registration' => array(
+			'_' => 'حساب جديد',
+			'ask' => 'إنشاء حساب؟',
+			'title' => 'إنشاء الحساب',
+		),
+		'username' => array(
+			'_' => 'اسم المستخدم',
+			'format' => '<small>من 1 إلى 39 حرفًا: حروف وأرقام و <code>. _ @ -</code></small>',
+		),
+	),
+	'date' => array(
+		'Apr' => 'أبريل',
+		'Aug' => 'أغسطس',
+		'Dec' => 'ديسمبر',
+		'Feb' => 'فبراير',
+		'Jan' => 'يناير',
+		'Jul' => 'يوليو',
+		'Jun' => 'يونيو',
+		'Mar' => 'مارس',
+		'May' => 'مايو',
+		'Nov' => 'نوفمبر',
+		'Oct' => 'أكتوبر',
+		'Sep' => 'سبتمبر',
+		'apr' => 'أبريل',
+		'april' => 'أبريل',
+		'aug' => 'أغسطس',
+		'august' => 'أغسطس',
+		'before_yesterday' => 'أول أمس',
+		'dec' => 'ديسمبر',
+		'december' => 'ديسمبر',
+		'feb' => 'فبراير',
+		'february' => 'فبراير',
+		'format_date' => 'j %s Y',	// IGNORE
+		'format_date_hour' => 'j %s Y \\a\\t H\\:i',	// IGNORE
+		'fri' => 'الجمعة',
+		'jan' => 'يناير',
+		'january' => 'يناير',
+		'jul' => 'يوليو',
+		'july' => 'يوليو',
+		'jun' => 'يونيو',
+		'june' => 'يونيو',
+		'last_2_year' => 'آخر سنتين',
+		'last_3_month' => 'آخر ثلاثة أشهر',
+		'last_3_year' => 'آخر ثلاث سنوات',
+		'last_5_year' => 'آخر خمس سنوات',
+		'last_6_month' => 'آخر ستة أشهر',
+		'last_month' => 'الشهر الماضي',
+		'last_week' => 'الأسبوع الماضي',
+		'last_year' => 'السنة الماضية',
+		'mar' => 'مارس',
+		'march' => 'مارس',
+		'may' => 'مايو',
+		'may_' => 'مايو',
+		'mon' => 'الاثنين',
+		'month' => 'أشهر',
+		'nov' => 'نوفمبر',
+		'november' => 'نوفمبر',
+		'oct' => 'أكتوبر',
+		'october' => 'أكتوبر',
+		'sat' => 'السبت',
+		'sep' => 'سبتمبر',
+		'september' => 'سبتمبر',
+		'sun' => 'الأحد',
+		'thu' => 'الخميس',
+		'today' => 'اليوم',
+		'tue' => 'الثلاثاء',
+		'wed' => 'الأربعاء',
+		'yesterday' => 'أمس',
+	),
+	'dir' => 'rtl',
+	'freshrss' => array(
+		'_' => 'FreshRSS',	// IGNORE
+		'about' => 'حول FreshRSS',
+	),
+	'interval' => array(
+		'day' => array(
+			0 => 'قبل %d يوم',
+			1 => 'قبل %d يوم',
+			2 => 'قبل %d يومين',
+			3 => 'قبل %d أيام',
+			4 => 'قبل %d يومًا',
+			5 => 'قبل %d يوم',
+		),
+		'hour' => array(
+			0 => 'قبل %d ساعة',
+			1 => 'قبل %d ساعة',
+			2 => 'قبل %d ساعتين',
+			3 => 'قبل %d ساعات',
+			4 => 'قبل %d ساعةً',
+			5 => 'قبل %d ساعة',
+		),
+		'justnow' => 'الآن',
+		'minute' => array(
+			0 => 'قبل %d دقيقة',
+			1 => 'قبل %d دقيقة',
+			2 => 'قبل %d دقيقتين',
+			3 => 'قبل %d دقائق',
+			4 => 'قبل %d دقيقةً',
+			5 => 'قبل %d دقيقة',
+		),
+		'month' => array(
+			0 => 'قبل %d شهر',
+			1 => 'قبل %d شهر',
+			2 => 'قبل %d شهرين',
+			3 => 'قبل %d أشهر',
+			4 => 'قبل %d شهرًا',
+			5 => 'قبل %d شهر',
+		),
+		'second' => array(
+			0 => 'قبل %d ثانية',
+			1 => 'قبل %d ثانية',
+			2 => 'قبل %d ثانيتين',
+			3 => 'قبل %d ثوانٍ',
+			4 => 'قبل %d ثانيةً',
+			5 => 'قبل %d ثانية',
+		),
+		'year' => array(
+			0 => 'قبل %d سنة',
+			1 => 'قبل %d سنة',
+			2 => 'قبل %d سنتين',
+			3 => 'قبل %d سنوات',
+			4 => 'قبل %d سنةً',
+			5 => 'قبل %d سنة',
+		),
+	),
+	'js' => array(
+		'category_empty' => 'تصنيف فارغ',
+		'confirm_action' => 'هل أنت متأكد أنك تريد تنفيذ هذا الإجراء؟ لا يمكن التراجع عنه!',
+		'confirm_action_feed_cat' => 'هل أنت متأكد أنك تريد تنفيذ هذا الإجراء؟ ستفقد المفضلات واستعلامات المستخدم ذات الصلة. لا يمكن التراجع عنه!',
+		'confirm_exit_slider' => 'هل أنت متأكد أنك تريد تجاهل الإعدادات غير المحفوظة؟',
+		'feedback' => array(
+			'body_new_articles' => array(
+				0 => 'يوجد %d مقال جديد للقراءة على FreshRSS.',
+				1 => 'يوجد %d مقال جديد للقراءة على FreshRSS.',
+				2 => 'يوجد %d مقالان جديدان للقراءة على FreshRSS.',
+				3 => 'يوجد %d مقالات جديدة للقراءة على FreshRSS.',
+				4 => 'يوجد %d مقالًا جديدًا للقراءة على FreshRSS.',
+				5 => 'يوجد %d مقال جديد للقراءة على FreshRSS.',
+			),
+			'body_unread_articles' => array(
+				0 => '(غير مقروء: %d)',
+				1 => '(غير مقروء: %d)',
+				2 => '(غير مقروء: %d)',
+				3 => '(غير مقروء: %d)',
+				4 => '(غير مقروء: %d)',
+				5 => '(غير مقروء: %d)',
+			),
+			'request_failed' => 'فشل أحد الطلبات، وقد يكون ذلك بسبب مشكلات في الاتصال بالإنترنت.',
+			'title_new_articles' => 'FreshRSS: مقالات جديدة!',
+		),
+		'labels_empty' => 'لا توجد تسميات',
+		'new_article' => 'توجد مقالات جديدة متاحة، انقر لتحديث الصفحة.',
+		'should_be_activated' => 'يجب تفعيل JavaScript',
+		'unsafe_csp_header' => 'ترويسة CSP المستخدمة غير آمنة وقد يكون FreshRSS عرضة لهجمات XSS. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">اطلع على الوثائق</a>',
+	),
+	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
+		'az' => 'Azərbaycanca',	// IGNORE
+		'be' => 'Беларуская',	// IGNORE
+		'cs' => 'Čeština',	// IGNORE
+		'de' => 'Deutsch',	// IGNORE
+		'el' => 'Ελληνικά',	// IGNORE
+		'en' => 'English',	// IGNORE
+		'en-US' => 'English (United States)',	// IGNORE
+		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
+		'fi' => 'Suomi',	// IGNORE
+		'fr' => 'Français',	// IGNORE
+		'he' => 'עברית',	// IGNORE
+		'hu' => 'Magyar',	// IGNORE
+		'id' => 'Bahasa Indonesia',	// IGNORE
+		'it' => 'Italiano',	// IGNORE
+		'ja' => '日本語',	// IGNORE
+		'ko' => '한국어',	// IGNORE
+		'lt' => 'Lietuvių',	// IGNORE
+		'lv' => 'Latviešu',	// IGNORE
+		'nl' => 'Nederlands',	// IGNORE
+		'oc' => 'Occitan',	// IGNORE
+		'pl' => 'Polski',	// IGNORE
+		'pt-BR' => 'Português (Brasil)',	// IGNORE
+		'pt-PT' => 'Português (Portugal)',	// IGNORE
+		'ru' => 'Русский',	// IGNORE
+		'sk' => 'Slovenčina',	// IGNORE
+		'tr' => 'Türkçe',	// IGNORE
+		'uk' => 'Українська',	// IGNORE
+		'zh-CN' => '简体中文',	// IGNORE
+		'zh-TW' => '正體中文',	// IGNORE
+	),
+	'menu' => array(
+		'about' => 'حول',
+		'account' => 'الحساب',
+		'admin' => 'الإدارة',
+		'advanced_search' => 'البحث المتقدم',
+		'archiving' => 'الأرشفة',
+		'authentication' => 'المصادقة',
+		'check_install' => 'فحص التثبيت',
+		'configuration' => 'الإعدادات',
+		'display' => 'العرض',
+		'extensions' => 'الإضافات',
+		'logs' => 'السجلات',
+		'privacy' => 'الخصوصية',
+		'queries' => 'استعلامات المستخدم',
+		'reading' => 'القراءة',
+		'search' => 'ابحث عن كلمات أو #وسوم',
+		'search_help' => 'اطلع على الوثائق لمعرفة معلمات <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">البحث المتقدم</a>',
+		'sharing' => 'المشاركة',
+		'shortcuts' => 'الاختصارات',
+		'stats' => 'الإحصاءات',
+		'system' => 'تهيئة النظام',
+		'update' => 'التحديث',
+		'user_management' => 'إدارة المستخدمين',
+		'user_profile' => 'الملف الشخصي',
+	),
+	'period' => array(
+		'days' => 'أيام',
+		'hours' => 'ساعات',
+		'months' => 'أشهر',
+		'weeks' => 'أسابيع',
+		'years' => 'سنوات',
+	),
+	'readme' => array(
+		'contribute' => 'المساهمة',
+		'language' => 'اللغة',
+		'translated' => 'التقدم',
+	),
+	'search' => array(
+		'advanced_search_help' => 'يساعدك هذا النموذج في إنشاء استعلامات البحث، لكن الاستعلامات اليدوية أكثر قوة.',
+		'authors' => 'المؤلفون',
+		'categories' => 'التصنيفات',
+		'content' => 'المحتوى',
+		'date_from' => 'من',
+		'date_modified' => 'تاريخ تعديل الخادم',
+		'date_past' => 'في الماضي',
+		'date_published' => 'تاريخ النشر',
+		'date_range' => 'النطاق الزمني',
+		'date_received' => 'تاريخ الاستلام',
+		'date_to' => 'إلى',
+		'date_user' => 'تاريخ تعديل المستخدم',
+		'feeds' => 'الخلاصات',
+		'free_text' => 'نص حر',
+		'free_text_help' => 'البحث في العنوان والمحتوى معًا',
+		'full_documentation' => 'عرض <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">وثائق البحث الكاملة</a>',
+		'labels' => 'تسمياتي',
+		'multiple_help' => 'حدد واحدًا أو أكثر (اضغط باستمرار على <kbd>Ctrl</kbd> أو <kbd>Cmd</kbd>)',
+		'sources' => 'المصادر',
+		'tags' => 'وسوم المقالات',
+		'text' => 'البحث النصي',
+		'text_help' => 'تُجمع الأسطر المتعددة باستخدام <i>أو</i> المنطقية. يدعم أيضًا <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#regex" target="_blank">التعابير النمطية</a>.',
+		'text_placeholder' => 'كلمة مفتاحية',
+		'title' => 'العنوان',
+		'url' => 'URL',	// IGNORE
+		'user_queries' => 'استعلامات المستخدم',
+	),
+	'share' => array(
+		'Known' => 'المواقع المعتمدة على Known',
+		'archiveIS' => 'archive.is',	// IGNORE
+		'archiveORG' => 'archive.org',	// IGNORE
+		'archivePH' => 'archive.ph',	// IGNORE
+		'bluesky' => 'Bluesky',	// IGNORE
+		'buffer' => 'Buffer',	// IGNORE
+		'clipboard' => 'الحافظة',
+		'diaspora' => 'Diaspora*',	// IGNORE
+		'email' => 'البريد الإلكتروني',
+		'email-webmail-firefox-fix' => 'البريد الإلكتروني (بريد الويب - إصلاح لـ Firefox)',
+		'facebook' => 'Facebook',	// IGNORE
+		'gnusocial' => 'GNU social',	// IGNORE
+		'jdh' => 'Journal du hacker',	// IGNORE
+		'lemmy' => 'Lemmy',	// IGNORE
+		'linkace' => 'LinkAce',	// IGNORE
+		'linkding' => 'Linkding',	// IGNORE
+		'linkedin' => 'LinkedIn',	// IGNORE
+		'mastodon' => 'Mastodon',	// IGNORE
+		'movim' => 'Movim',	// IGNORE
+		'nextcloud-bookmarks' => 'الإشارات المرجعية في Nextcloud',
+		'omnivore' => 'Omnivore',	// IGNORE
+		'pinboard' => 'Pinboard',	// IGNORE
+		'pinterest' => 'Pinterest',	// IGNORE
+		'print' => 'طباعة',
+		'raindrop' => 'Raindrop.io',	// IGNORE
+		'reddit' => 'Reddit',	// IGNORE
+		'shaarli' => 'Shaarli',	// IGNORE
+		'telegram' => 'Telegram',	// IGNORE
+		'twitter' => 'Twitter',	// IGNORE
+		'wallabag' => 'wallabag v1',	// IGNORE
+		'wallabagv2' => 'wallabag v2',	// IGNORE
+		'web-sharing-api' => 'مشاركة النظام',
+		'whatsapp' => 'Whatsapp',	// IGNORE
+		'xing' => 'Xing',	// IGNORE
+	),
+	'short' => array(
+		'attention' => 'تحذير!',
+		'blank_to_disable' => 'اتركه فارغًا للتعطيل',
+		'by_author' => 'بواسطة:',
+		'by_default' => 'افتراضيًا',
+		'damn' => 'تبًا!',
+		'default_category' => 'غير مصنف',
+		'no' => 'لا',
+		'not_applicable' => 'غير متاح',
+		'ok' => 'حسنًا!',
+		'or' => 'أو',
+		'yes' => 'نعم',
+	),
+	'stream' => array(
+		'load_more' => 'تحميل مزيد من المقالات',
+		'mark_all_read' => 'وضع علامة على الكل كمقروء',
+		'nothing_to_load' => 'لا توجد مقالات أخرى',
+	),
+);

+ 132 - 0
app/i18n/ar/index.php

@@ -0,0 +1,132 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its   *
+ * state. When there is no comment, it means the entry is fully translated.   *
+ * The recognized comments are (comment matching is case-insensitive):        *
+ *   + TODO: the entry has never been translated.                             *
+ *   + DIRTY: the entry has been translated but needs to be updated.          *
+ *   + IGNORE: the entry does not need to be translated.                      *
+ * When a comment is not recognized, it is discarded.                         *
+ ******************************************************************************/
+
+return array(
+	'about' => array(
+		'_' => 'حول',
+		'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',	// IGNORE
+		'bug_reports' => array(
+			'environment_information' => array(
+				'_' => 'معلومات النظام',
+				'browser' => 'المتصفح',
+				'database' => 'قاعدة البيانات',
+				'server_software' => 'برنامج الخادم',
+				'version_curl' => 'إصدار cURL',
+				'version_frss' => 'إصدار FreshRSS',
+				'version_php' => 'إصدار PHP',
+			),
+		),
+		'bugs_reports' => 'تقارير الأخطاء',
+		'documentation' => 'التوثيق',
+		'freshrss_description' => 'FreshRSS هو مجمّع وقارئ خلاصات RSS قابل للاستضافة الذاتية. يتيح لك قراءة ومتابعة العديد من مواقع الأخبار بنظرة واحدة دون الحاجة إلى التنقل من موقع إلى آخر. FreshRSS خفيف وقابل للتخصيص وسهل الاستخدام.',
+		'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">على GitHub</a>',
+		'license' => 'الترخيص',
+		'project_website' => 'موقع المشروع',
+		'title' => 'حول',
+		'version' => 'الإصدار',
+	),
+	'feed' => array(
+		'empty' => 'لا توجد مقالات لعرضها.',
+		'published' => array(
+			'_' => 'نُشر',
+			'future' => 'نُشر في المستقبل',
+			'today' => 'نُشر اليوم',
+			'yesterday' => 'نُشر أمس',
+		),
+		'received' => array(
+			'_' => 'تم الاستلام',
+			'today' => 'تم الاستلام اليوم',
+			'yesterday' => 'تم الاستلام أمس',
+		),
+		'rss_of' => 'خلاصة RSS الخاصة بـ %s',
+		'title' => 'التدفق الرئيسي',
+		'title_fav' => 'المفضلة',
+		'title_global' => 'العرض الشامل',
+		'userModified' => array(
+			'_' => 'عدّله المستخدم',
+			'today' => 'عدّله المستخدم اليوم',
+			'yesterday' => 'عدّله المستخدم أمس',
+		),
+	),
+	'log' => array(
+		'_' => 'السجلات',
+		'clear' => 'مسح السجلات',
+		'empty' => 'ملف السجل فارغ',
+		'title' => 'السجلات',
+	),
+	'menu' => array(
+		'about' => 'حول FreshRSS',
+		'before_one_day' => 'أقدم من يوم واحد',
+		'before_one_week' => 'أقدم من أسبوع واحد',
+		'bookmark_query' => 'حفظ الاستعلام الحالي في المفضلة',
+		'favorites' => 'المفضلة (%s)',
+		'global_view' => 'العرض الشامل',
+		'important' => 'الخلاصات المهمة',
+		'main_stream' => 'التدفق الرئيسي',
+		'mark_all_read' => 'تعليم الكل كمقروء',
+		'mark_cat_read' => 'تعليم التصنيف كمقروء',
+		'mark_feed_read' => 'تعليم الخلاصة كمقروءة',
+		'mark_selection_unread' => 'تعليم التحديد كغير مقروء',
+		'mylabels' => 'تسمياتي',
+		'non-starred' => 'إظهار غير المفضلة',
+		'normal_view' => 'العرض العادي',
+		'queries' => 'استعلامات المستخدم',
+		'read' => 'إظهار المقروءة',
+		'reader_view' => 'عرض القراءة',
+		'rss_view' => 'خلاصة RSS',
+		'search_short' => 'بحث',
+		'sort' => array(
+			'asc' => 'تصاعدي',
+			'c' => array(
+				'name_asc' => 'التصنيف، عناوين الخلاصات A→Z',
+				'name_desc' => 'التصنيف، عناوين الخلاصات Z→A',
+			),
+			'date_asc' => 'تاريخ النشر 1→9',
+			'date_desc' => 'تاريخ النشر 9→1',
+			'desc' => 'تنازلي',
+			'f' => array(
+				'name_asc' => 'عنوان الخلاصة A→Z',
+				'name_desc' => 'عنوان الخلاصة Z→A',
+			),
+			'id_asc' => 'المستلمة حديثًا أخيرًا',
+			'id_desc' => 'المستلمة حديثًا أولًا',
+			'length_asc' => 'طول المحتوى 1→9',
+			'length_desc' => 'طول المحتوى 9→1',
+			'link_asc' => 'الرابط A→Z',
+			'link_desc' => 'الرابط Z→A',
+			'primary' => array(
+				'_' => 'معيار الفرز',
+				'help' => 'يُنصح بالفرز حسب تاريخ <em>الاستلام</em> في معظم الحالات، من أجل الاتساق والأداء',
+			),
+			'rand' => 'ترتيب عشوائي',
+			'secondary' => array(
+				'_' => 'معيار الفرز الثانوي',
+				'help' => 'ذو صلة فقط عندما يكون معيار الفرز الأساسي هو التصنيفات أو عناوين الخلاصات',
+			),
+			'title_asc' => 'العنوان A→Z',
+			'title_desc' => 'العنوان Z→A',
+			'user_modified_asc' => 'تعديل المستخدم 1→9',
+			'user_modified_desc' => 'تعديل المستخدم 9→1',
+		),
+		'starred' => 'إظهار المفضلة',
+		'stats' => 'الإحصائيات',
+		'subscription' => 'إدارة الاشتراكات',
+		'unread' => 'إظهار غير المقروءة',
+	),
+	'share' => 'مشاركة',
+	'tag' => array(
+		'related' => 'وسوم المقال',
+	),
+	'tos' => array(
+		'title' => 'شروط الخدمة',
+	),
+);

+ 173 - 0
app/i18n/ar/install.php

@@ -0,0 +1,173 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its   *
+ * state. When there is no comment, it means the entry is fully translated.   *
+ * The recognized comments are (comment matching is case-insensitive):        *
+ *   + TODO: the entry has never been translated.                             *
+ *   + DIRTY: the entry has been translated but needs to be updated.          *
+ *   + IGNORE: the entry does not need to be translated.                      *
+ * When a comment is not recognized, it is discarded.                         *
+ ******************************************************************************/
+
+return array(
+	'action' => array(
+		'finish' => 'إكمال التثبيت',
+		'fix_errors_before' => 'يرجى إصلاح جميع الأخطاء قبل المتابعة إلى الخطوة التالية.',
+		'keep_install' => 'الاحتفاظ بالإعدادات السابقة',
+		'next_step' => 'الانتقال إلى الخطوة التالية',
+		'reinstall' => 'إعادة تثبيت FreshRSS',
+	),
+	'bdd' => array(
+		'_' => 'قاعدة البيانات',
+		'conf' => array(
+			'_' => 'إعدادات قاعدة البيانات',
+			'ko' => 'تحقق من إعدادات قاعدة البيانات الخاصة بك.',
+			'ok' => 'تم حفظ إعدادات قاعدة البيانات.',
+		),
+		'host' => 'المضيف',
+		'password' => 'كلمة مرور قاعدة البيانات',
+		'prefix' => 'بادئة الجداول',
+		'type' => 'نوع قاعدة البيانات',
+		'username' => 'اسم مستخدم قاعدة البيانات',
+	),
+	'check' => array(
+		'_' => 'الفحوصات',
+		'already_installed' => 'لقد اكتشفنا أن FreshRSS مثبت بالفعل!',
+		'cache' => array(
+			'nok' => 'تحقق من الأذونات على دليل <em>%1$s</em> للمستخدم <em>%2$s</em>. يجب أن يكون لخادم HTTP إذن الكتابة.',
+			'ok' => 'أذونات دليل ذاكرة التخزين المؤقت جيدة.',
+		),
+		'ctype' => array(
+			'nok' => 'لا يمكن العثور على المكتبة المطلوبة للتحقق من أنواع الأحرف (php-ctype).',
+			'ok' => 'لديك المكتبة المطلوبة للتحقق من أنواع الأحرف (ctype).',
+		),
+		'curl' => array(
+			'nok' => 'لا يمكن العثور على مكتبة cURL المطلوبة (حزمة php-curl).',
+			'ok' => 'لديك مكتبة cURL المطلوبة.',
+		),
+		'data' => array(
+			'nok' => 'تحقق من الأذونات على دليل <em>%1$s</em> للمستخدم <em>%2$s</em>. يجب أن يكون لخادم HTTP إذن الكتابة.',
+			'ok' => 'أذونات دليل البيانات جيدة.',
+		),
+		'database-connection' => array(
+			'nok' => 'خطأ في الاتصال بقاعدة البيانات.',
+			'ok' => 'الاتصال بقاعدة البيانات جيد.',
+		),
+		'database-table' => array(
+			'nok' => 'جدول قاعدة البيانات "%s" غير مكتمل.',
+			'ok' => 'جدول قاعدة البيانات "%s" جيد.',
+		),
+		'database-tables' => array(
+			'nok' => 'بعض جداول قاعدة البيانات مفقودة.',
+			'ok' => 'جميع جداول قاعدة البيانات موجودة.',
+		),
+		'database-title' => 'قاعدة البيانات',
+		'docroot' => array(
+			'nok' => 'لا يبدو أن جذر مستندات خادم الويب يشير إلى مجلد <code>./p/</code>. قد تكون مجلدات أخرى مثل <code>./data/</code> متاحة للعامة.',
+			'ok' => 'يشير جذر مستندات خادم الويب بشكل صحيح إلى مجلد <code>./p/</code>.',
+		),
+		'dom' => array(
+			'nok' => 'لا يمكن العثور على المكتبة المطلوبة لتصفح DOM.',
+			'ok' => 'لديك المكتبة المطلوبة لتصفح DOM.',
+		),
+		'favicons' => array(
+			'nok' => 'تحقق من الأذونات على دليل <em>%1$s</em> للمستخدم <em>%2$s</em>. يجب أن يكون لخادم HTTP إذن الكتابة.',
+			'ok' => 'أذونات دليل الأيقونات المفضلة جيدة.',
+		),
+		'fileinfo' => array(
+			'nok' => 'لا يمكن العثور على مكتبة PHP fileinfo الموصى بها (حزمة fileinfo).',
+			'ok' => 'لديك مكتبة PHP fileinfo الموصى بها (حزمة fileinfo).',
+		),
+		'files' => 'تثبيت الملفات',
+		'gmp' => array(
+			'nok' => 'لا يمكن العثور على إضافة GMP المطلوبة لـ PHP بنظام 32 بت (حزمة php-gmp).',
+			'ok' => 'لديك إضافة GMP المطلوبة لـ PHP بنظام 32 بت.',
+		),
+		'intl' => array(
+			'nok' => 'لا يمكن العثور على المكتبة الموصى بها php-intl للتدويل.',
+			'ok' => 'لديك المكتبة الموصى بها php-intl للتدويل.',
+		),
+		'json' => array(
+			'nok' => 'لا يمكن العثور على المكتبة المطلوبة لتحليل JSON.',
+			'ok' => 'لديك المكتبة المطلوبة لتحليل JSON.',
+		),
+		'mbstring' => array(
+			'nok' => 'لا يمكن العثور على المكتبة الموصى بها mbstring لـ Unicode.',
+			'ok' => 'لديك المكتبة الموصى بها mbstring لـ Unicode.',
+		),
+		'pcre' => array(
+			'nok' => 'لا يمكن العثور على المكتبة المطلوبة للتعابير النمطية (php-pcre).',
+			'ok' => 'لديك المكتبة المطلوبة للتعابير النمطية (PCRE).',
+		),
+		'pdo-mysql' => array(
+			'nok' => 'لا يمكن العثور على برنامج تشغيل PDO المطلوب لـ MySQL/MariaDB.',
+		),
+		'pdo-pgsql' => array(
+			'nok' => 'لا يمكن العثور على برنامج تشغيل PDO المطلوب لـ PostgreSQL.',
+		),
+		'pdo-sqlite' => array(
+			'nok' => 'لا يمكن العثور على برنامج تشغيل PDO لـ SQLite.',
+			'ok' => 'لديك برنامج تشغيل PDO لـ SQLite.',
+		),
+		'pdo' => array(
+			'nok' => 'لا يمكن العثور على PDO أو أحد برامج التشغيل المدعومة (pdo_sqlite، pdo_pgsql، pdo_mysql).',
+			'ok' => 'لديك PDO وواحد على الأقل من برامج التشغيل المدعومة (pdo_sqlite، pdo_pgsql، pdo_mysql).',
+		),
+		'php' => array(
+			'_' => 'تثبيت PHP',
+			'nok' => 'إصدار PHP الخاص بك هو %s لكن FreshRSS يتطلب الإصدار %s على الأقل.',
+			'ok' => 'إصدار PHP الخاص بك (%s) متوافق مع FreshRSS.',
+		),
+		'reload' => 'التحقق مرة أخرى',
+		'tmp' => array(
+			'nok' => 'تحقق من الأذونات على دليل <em>%1$s</em> للمستخدم <em>%2$s</em>. يجب أن يكون لخادم HTTP أذونات الكتابة.',
+			'ok' => 'أذونات الدليل المؤقت جيدة.',
+		),
+		'tokens' => array(
+			'nok' => 'تحقق من الأذونات على دليل <em>./data/tokens</em>. يجب أن يكون لخادم HTTP إذن الكتابة',
+			'ok' => 'أذونات دليل الرموز جيدة.',
+		),
+		'unknown_process_username' => 'غير معروف',
+		'users' => array(
+			'nok' => 'تحقق من الأذونات على دليل <em>%1$s</em> للمستخدم <em>%2$s</em>. يجب أن يكون لخادم HTTP أذونات الكتابة.',
+			'ok' => 'أذونات دليل المستخدمين جيدة.',
+		),
+		'xml' => array(
+			'nok' => 'لا يمكن العثور على المكتبة المطلوبة لتحليل XML.',
+			'ok' => 'لديك المكتبة المطلوبة لتحليل XML.',
+		),
+		'zip' => array(
+			'nok' => 'لا يمكن العثور على الإضافة الموصى بها لـ ZIP (حزمة php-zip).',
+			'ok' => 'لديك الإضافة الموصى بها لـ ZIP (حزمة php-zip).',
+		),
+	),
+	'conf' => array(
+		'_' => 'الإعدادات العامة',
+		'ok' => 'تم حفظ الإعدادات العامة.',
+	),
+	'congratulations' => 'تهانينا!',
+	'default_user' => array(
+		'_' => 'اسم مستخدم المستخدم الافتراضي',
+		'max_char' => '1-39 حرفًا: أحرف وأرقام و <code>. _ @ -</code>',
+	),
+	'fix_errors_before' => 'يرجى إصلاح الأخطاء قبل المتابعة إلى الخطوة التالية.',
+	'javascript_is_better' => 'يكون FreshRSS أكثر متعة مع تفعيل JavaScript',
+	'js' => array(
+		'confirm_reinstall' => 'ستفقد إعداداتك السابقة بإعادة تثبيت FreshRSS. هل أنت متأكد من رغبتك في المتابعة؟',
+	),
+	'language' => array(
+		'_' => 'اللغة',
+		'choose' => 'اختر لغة لـ FreshRSS',
+		'defined' => 'تم تعريف اللغة.',
+	),
+	'missing_applied_migrations' => 'حدث خطأ ما؛ يجب عليك إنشاء ملف فارغ <em>%s</em> يدويًا.',
+	'ok' => 'كانت عملية التثبيت ناجحة.',
+	'session' => array(
+		'nok' => 'يبدو أن خادم الويب مهيأ بشكل غير صحيح لملفات تعريف الارتباط المطلوبة لجلسات PHP!',
+	),
+	'step' => 'الخطوة %d',
+	'steps' => 'الخطوات',
+	'this_is_the_end' => 'هذه هي النهاية',
+	'title' => 'التثبيت · FreshRSS',
+);

+ 10 - 0
app/i18n/ar/plurals.php

@@ -0,0 +1,10 @@
+<?php
+
+// Plural-Forms: nplurals=6; plural=(n==0) ? 0 : (n==1) ? 1 : (n==2) ? 2 : (n%100>=3 && n%100<=10) ? 3 : (n%100>=11) ? 4 : 5;
+// This file is generated by cli/compile.plurals.php.
+// Edit the formula comment and run `make fix-all`.
+
+return array(
+	'nplurals' => 6,
+	'plural' => static fn (int $n): int => ($n === 0 ? 0 : ($n === 1 ? 1 : ($n === 2 ? 2 : ($n % 100 >= 3 && $n % 100 <= 10 ? 3 : ($n % 100 >= 11 ? 4 : 5))))),
+);

+ 317 - 0
app/i18n/ar/sub.php

@@ -0,0 +1,317 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its   *
+ * state. When there is no comment, it means the entry is fully translated.   *
+ * The recognized comments are (comment matching is case-insensitive):        *
+ *   + TODO: the entry has never been translated.                             *
+ *   + DIRTY: the entry has been translated but needs to be updated.          *
+ *   + IGNORE: the entry does not need to be translated.                      *
+ * When a comment is not recognized, it is discarded.                         *
+ ******************************************************************************/
+
+return array(
+	'api' => array(
+		'documentation' => 'انسخ عنوان URL التالي لاستخدامه داخل أداة خارجية.',
+		'title' => 'API',	// IGNORE
+	),
+	'bookmarklet' => array(
+		'documentation' => 'اسحب هذا الزر إلى شريط أدوات الإشارات المرجعية أو انقر عليه بزر الفأرة الأيمن واختر «وضع إشارة مرجعية على هذا الرابط». ثم انقر على زر «اشتراك» في أي صفحة تريد الاشتراك فيها.',
+		'label' => 'اشتراك',
+		'title' => 'أداة الإشارة المرجعية',
+	),
+	'category' => array(
+		'_' => 'تصنيف',
+		'add' => 'إضافة تصنيف',
+		'archiving' => 'الأرشفة',
+		'dynamic_opml' => array(
+			'_' => 'OPML ديناميكي',
+			'help' => 'قدّم عنوان URL لملف <a href="https://opml.org/" target="_blank">OPML</a> لملء هذا التصنيف بالخلاصات ديناميكيًا',
+		),
+		'empty' => 'تصنيف فارغ',
+		'error' => 'واجه هذا التصنيف الديناميكي OPML مشكلة. تحقق من أن عنوان OPML ما يزال متاحًا، ومن أن الحد الأقصى لعدد الخلاصات لكل مستخدم لم يتم تجاوزه.',
+		'expand' => 'توسيع التصنيف',
+		'information' => 'معلومات',
+		'open' => 'فتح التصنيف',
+		'opml_url' => 'عنوان OPML',
+		'position' => 'موضع العرض',
+		'position_help' => 'للتحكم في ترتيب فرز التصنيفات',
+		'title' => 'العنوان',
+	),
+	'feed' => array(
+		'accept_cookies' => 'قبول ملفات تعريف الارتباط',
+		'accept_cookies_help' => 'السماح لخادم الخلاصة بتعيين ملفات تعريف الارتباط (تُحفظ في الذاكرة لمدة الطلب فقط)',
+		'add' => 'إضافة خلاصة',
+		'advanced' => 'متقدم',
+		'archiving' => 'الأرشفة',
+		'auth' => array(
+			'configuration' => 'تسجيل الدخول',
+			'help' => 'يتيح الوصول إلى خلاصات RSS المحمية عبر HTTP',
+			'http' => 'مصادقة HTTP',
+			'password' => 'كلمة مرور HTTP',
+			'username' => 'اسم مستخدم HTTP',
+		),
+		'change_favicon' => 'تغيير…',
+		'clear_cache' => 'مسح ذاكرة التخزين المؤقت دائمًا',
+		'content_action' => array(
+			'_' => 'إجراء المحتوى عند جلب محتوى المقال',
+			'append' => 'الإضافة بعد المحتوى الحالي',
+			'prepend' => 'الإضافة قبل المحتوى الحالي',
+			'replace' => 'استبدال المحتوى الحالي',
+		),
+		'content_retrieval' => 'استرجاع المحتوى',
+		'css_cookie' => 'استخدام ملفات تعريف الارتباط عند جلب محتوى المقال',
+		'css_cookie_help' => 'مثال: <kbd>foo=bar; gdpr_consent=true; cookie=value</kbd>',
+		'css_help' => 'يستعيد خلاصات RSS المقتطعة (تنبيه: يتطلب وقتًا أطول!)',
+		'css_path' => 'محدد CSS للمقال على الموقع الأصلي',
+		'css_path_filter' => array(
+			'_' => 'محدد CSS للعناصر المراد إزالتها',
+			'help' => 'قد يكون محدد CSS قائمة مثل: <kbd>footer, aside, p[data-sanitized-class~="menu"]</kbd>',
+		),
+		'description' => 'الوصف',
+		'empty' => 'هذه الخلاصة فارغة. يرجى التحقق من أنها ما تزال قائمة.',
+		'error' => 'واجهت هذه الخلاصة مشكلة. إذا استمرت هذه الحالة، يرجى التحقق من أنها ما تزال متاحة.',
+		'export-as-opml' => array(
+			'download' => 'تنزيل',
+			'help' => 'ملف XML (مجموعة فرعية من البيانات. <a href="https://freshrss.github.io/FreshRSS/en/developers/OPML.html" target="_blank">اطّلع على الوثائق</a>)',
+			'label' => 'التصدير بصيغة OPML',
+		),
+		'ext_favicon' => 'التعيين تلقائيًا',
+		'favicon_changed_by_ext' => 'تم تعيين الأيقونة بواسطة إضافة <b>%s</b>.',
+		'filteractions' => array(
+			'_' => 'إجراءات التصفية',
+			'help' => 'اكتب عامل تصفية بحث واحدًا في كل سطر. العوامل <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">اطّلع على الوثائق</a>.',
+			'view_filter' => 'معاينة عوامل التصفية على المقالات الحالية (نافذة جديدة)',
+		),
+		'global_hint' => 'استخدم <a href="%s">العرض الشامل</a> لمعرفة عدد المقالات في كل خلاصة التي تطابق حالة أو عبارة بحث',
+		'http_headers' => 'ترويسات HTTP',
+		'http_headers_help' => 'تُفصل الترويسات بسطر جديد، ويُفصل اسم الترويسة وقيمتها بنقطتين رأسيتين (مثال: <kbd><code>Accept: application/atom+xml<br />Authorization: Bearer some-token</code></kbd>).',
+		'icon' => 'أيقونة',
+		'information' => 'معلومات',
+		'keep_adding_feed' => 'ثم أضف مزيدًا من الخلاصات',
+		'keep_min' => 'الحد الأدنى لعدد المقالات المراد الاحتفاظ به',
+		'kind' => array(
+			'_' => 'نوع مصدر الخلاصة',
+			'html_json' => array(
+				'_' => 'HTML + XPath + تدوين JSON بالنقاط (JSON في HTML)',
+				'xpath' => array(
+					'_' => 'XPath لـ JSON في HTML',
+					'help' => 'مثال: <code>normalize-space(//script[@type="application/json"])</code> (JSON واحد)<br />أو: <code>//script[@type="application/ld+json"]</code> (كائن JSON واحد لكل مقال)',
+				),
+			),
+			'html_xpath' => array(
+				'_' => 'HTML + XPath (استخلاص من الويب)',
+				'feed_title' => array(
+					'_' => 'عنوان الخلاصة',
+					'help' => 'مثال: <code>//title</code> أو سلسلة ثابتة: <code>"My custom feed"</code>',
+				),
+				'help' => '<dfn><a href="https://www.w3.org/TR/xpath-10/" target="_blank">XPath 1.0</a></dfn> هي لغة استعلام قياسية للمستخدمين المتقدمين، ويدعمها FreshRSS لتمكين الاستخلاص من الويب.',
+				'item' => array(
+					'_' => 'العثور على <strong>عناصر</strong> الأخبار<br /><small>(الأهم)</small>',
+					'help' => 'مثال: <code>//div[@class="news-item"]</code>',
+				),
+				'item_author' => array(
+					'_' => 'كاتب العنصر',
+					'help' => 'يمكن أن يكون أيضًا سلسلة ثابتة. مثال: <code>"Anonymous"</code>',
+				),
+				'item_categories' => 'وسوم العنصر',
+				'item_content' => array(
+					'_' => 'محتوى العنصر',
+					'help' => 'مثال لأخذ العنصر كاملاً: <code>.</code>',
+				),
+				'item_thumbnail' => array(
+					'_' => 'الصورة المصغرة للعنصر',
+					'help' => 'مثال: <code>descendant::img/@src</code>',
+				),
+				'item_timeFormat' => array(
+					'_' => 'تنسيق مخصص للتاريخ/الوقت',
+					'help' => 'اختياري. تنسيق يدعمه <a href="https://www.php.net/datetime.createfromformat" target="_blank"><code>DateTime::createFromFormat()</code></a> مثل <code>d-m-Y H:i:s</code>',
+				),
+				'item_timestamp' => array(
+					'_' => 'تاريخ العنصر',
+					'help' => 'سيتم تحليل النتيجة بواسطة <a href="https://www.php.net/strtotime" target="_blank"><code>strtotime()</code></a>',
+				),
+				'item_title' => array(
+					'_' => 'عنوان العنصر',
+					'help' => 'استخدم على وجه الخصوص <a href="https://developer.mozilla.org/docs/Web/XML/XPath/Reference/Axes" target="_blank">محور XPath</a> <code>descendant::</code> مثل <code>descendant::h2</code>',
+				),
+				'item_uid' => array(
+					'_' => 'المعرف الفريد للعنصر',
+					'help' => 'اختياري. مثال: <code>descendant::div/@data-uri</code>',
+				),
+				'item_uri' => array(
+					'_' => 'رابط العنصر (URL)',
+					'help' => 'مثال: <code>descendant::a/@href</code>',
+				),
+				'relative' => 'XPath (نسبي إلى العنصر) لـ:',
+				'xpath' => 'XPath لـ:',
+			),
+			'json_dotnotation' => array(
+				'_' => 'JSON (تدوين بالنقاط)',
+				'feed_title' => array(
+					'_' => 'عنوان الخلاصة',
+					'help' => 'مثال: <code>meta.title</code> أو سلسلة ثابتة: <code>"My custom feed"</code>',
+				),
+				'help' => 'يستخدم تدوين JSON بالنقاط النقاط بين الكائنات والأقواس المعقوفة للمصفوفات (مثال: <code>data.items[0].title</code>)',
+				'item' => array(
+					'_' => 'العثور على <strong>عناصر</strong> الأخبار<br /><small>(الأهم)</small>',
+					'help' => 'مسار JSON إلى المصفوفة التي تحتوي على العناصر، مثال: <code>$</code> أو <code>newsItems</code>',
+				),
+				'item_author' => 'كاتب العنصر',
+				'item_categories' => 'وسوم العنصر',
+				'item_content' => array(
+					'_' => 'محتوى العنصر',
+					'help' => 'المفتاح الذي يوجد تحته المحتوى، مثال: <code>content</code>',
+				),
+				'item_thumbnail' => array(
+					'_' => 'الصورة المصغرة للعنصر',
+					'help' => 'مثال: <code>image</code>',
+				),
+				'item_timeFormat' => array(
+					'_' => 'تنسيق مخصص للتاريخ/الوقت',
+					'help' => 'اختياري. تنسيق يدعمه <a href="https://www.php.net/datetime.createfromformat" target="_blank"><code>DateTime::createFromFormat()</code></a> مثل <code>d-m-Y H:i:s</code>',
+				),
+				'item_timestamp' => array(
+					'_' => 'تاريخ العنصر',
+					'help' => 'سيتم تحليل النتيجة بواسطة <a href="https://www.php.net/strtotime" target="_blank"><code>strtotime()</code></a>',
+				),
+				'item_title' => 'عنوان العنصر',
+				'item_uid' => 'المعرف الفريد للعنصر',
+				'item_uri' => array(
+					'_' => 'رابط العنصر (URL)',
+					'help' => 'مثال: <code>permalink</code>',
+				),
+				'json' => 'تدوين بالنقاط لـ:',
+				'relative' => 'مسار بتدوين بالنقاط (نسبي إلى العنصر) لـ:',
+			),
+			'jsonfeed' => 'JSON Feed',	// IGNORE
+			'rss' => 'RSS / Atom (الافتراضي)',
+			'xml_xpath' => 'XML + XPath',	// IGNORE
+		),
+		'last-entry-publication-date' => 'آخر مقال نُشر <time datetime="%1$s" title="%1$s">%2$s</time>.',
+		'last-entry-received-date' => 'آخر مقال تم استلامه <time datetime="%1$s" title="%1$s">%2$s</time>.',
+		'last-error-date' => 'آخر تحديث خاطئ <time datetime="%1$s" title="%1$s">%2$s</time>.',
+		'last-update' => 'آخر تحديث ناجح <time datetime="%1$s" title="%1$s">%2$s</time>.',
+		'maintenance' => array(
+			'clear_cache' => 'مسح ذاكرة التخزين المؤقت',
+			'clear_cache_help' => 'مسح ذاكرة التخزين المؤقت لهذه الخلاصة.',
+			'reload_articles' => 'إعادة تحميل المقالات',
+			'reload_articles_help' => 'إعادة تحميل هذا العدد من المقالات وجلب المحتوى الكامل إذا تم تحديد محدد.',
+			'title' => 'الصيانة',
+		),
+		'max_http_redir' => 'الحد الأقصى لإعادة توجيه HTTP',
+		'max_http_redir_help' => 'عيّن 0 أو اتركه فارغًا للتعطيل، و-1 لإعادة توجيه غير محدودة',
+		'method' => array(
+			'_' => 'طريقة HTTP',
+		),
+		'method_help' => 'تدعم حمولة POST تلقائيًا <code>application/x-www-form-urlencoded</code> و<code>application/json</code>',
+		'method_postparams' => 'حمولة POST',
+		'moved_category_deleted' => 'عند إزالة تصنيف، تُصنّف خلاصاته تلقائيًا تحت <em>%s</em>.',
+		'mute' => array(
+			'_' => 'كتم',
+			'state_is_muted' => 'هذه الخلاصة مكتومة',
+		),
+		'no_selected' => 'لم يتم تحديد أي خلاصة.',
+		'number_entries' => '%d مقال',
+		'open_feed' => 'فتح الخلاصة %s',
+		'path_entries_conditions' => 'شروط استرجاع المحتوى',
+		'priority' => array(
+			'_' => 'الظهور',
+			'category' => 'الإظهار في تصنيفها',
+			'feed' => 'الإظهار في خلاصتها',
+			'hidden' => 'عدم الإظهار',
+			'important' => 'الإظهار في الخلاصات المهمة',
+			'main_stream' => 'الإظهار في التدفق الرئيسي',
+		),
+		'proxy' => 'تعيين وكيل لجلب هذه الخلاصة',
+		'proxy_help' => 'اختر بروتوكولاً (مثال: SOCKS5) وأدخل عنوان الوكيل (مثال: <kbd>127.0.0.1:1080</kbd> أو <kbd>username:password@127.0.0.1:1080</kbd>)',
+		'reset_favicon' => 'إعادة التعيين إلى الافتراضي',
+		'selector_preview' => array(
+			'show_raw' => 'إظهار الشيفرة المصدرية',
+			'show_rendered' => 'إظهار المحتوى',
+		),
+		'show' => array(
+			'all' => 'كل الخلاصات',
+			'error' => 'إظهار الخلاصات ذات الأخطاء فقط',
+		),
+		'showing' => array(
+			'error' => 'إظهار الخلاصات ذات الأخطاء فقط',
+		),
+		'ssl_verify' => 'التحقق من أمان SSL',
+		'stats' => 'الإحصاءات',
+		'think_to_add' => 'يمكنك إضافة بعض الخلاصات.',
+		'timeout' => 'المهلة بالثواني',
+		'title' => 'العنوان',
+		'title_add' => 'إضافة خلاصة RSS',
+		'ttl' => 'عدم التحديث تلقائيًا أكثر من كل',
+		'unicityCriteria' => array(
+			'_' => 'معايير تفرد المقال',
+			'forced' => '<span title="فرض معايير التفرد، حتى عندما تحتوي الخلاصة على مقالات مكررة">مفروضة</span>',
+			'help' => 'ذات صلة بالخلاصات غير الصالحة.<br />⚠️ سيؤدي تغيير السياسة إلى إنشاء نسخ مكررة.',
+			'id' => 'المعرف القياسي (الافتراضي)',
+			'link' => 'الرابط',
+			'sha1:content' => 'المحتوى',
+			'sha1:content_published' => 'المحتوى + التاريخ',
+			'sha1:link_published' => 'الرابط + التاريخ',
+			'sha1:link_published_title' => 'الرابط + التاريخ + العنوان',
+			'sha1:link_published_title_content' => 'الرابط + التاريخ + العنوان + المحتوى',
+			'sha1:published' => 'التاريخ',
+			'sha1:title' => 'العنوان',
+			'sha1:title_published' => 'العنوان + التاريخ',
+			'sha1:title_published_content' => 'العنوان + التاريخ + المحتوى',
+		),
+		'url' => 'عنوان URL للخلاصة',
+		'useragent' => 'تعيين وكيل المستخدم لجلب هذه الخلاصة',
+		'useragent_help' => 'مثال: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',
+		'validator' => 'التحقق من صحة الخلاصة',
+		'website' => 'عنوان URL للموقع',
+		'websub' => 'إشعارات فورية عبر WebSub',
+		'websub_pending' => 'تم الاشتراك في WebSub. في انتظار الإشعار الأول.',
+	),
+	'import_export' => array(
+		'export' => array(
+			'_' => 'تصدير',
+			'sqlite' => 'تنزيل قاعدة بيانات المستخدم بصيغة SQLite',
+		),
+		'export_labelled' => 'تصدير مقالاتك الموسومة',
+		'export_opml' => 'تصدير قائمة الخلاصات (OPML)',
+		'export_starred' => 'تصدير مفضلتك',
+		'feed_list' => 'قائمة مقالات %s',
+		'file_to_import' => 'ملف للاستيراد<br />(OPML أو JSON أو ZIP)',
+		'file_to_import_no_zip' => 'ملف للاستيراد<br />(OPML أو JSON)',
+		'import' => 'استيراد',
+		'starred_list' => 'قائمة المقالات المفضلة',
+		'title' => 'استيراد / تصدير',
+	),
+	'menu' => array(
+		'add' => 'إضافة خلاصة أو تصنيف',
+		'import_export' => 'استيراد / تصدير',
+		'label_management' => 'إدارة التسميات',
+		'stats' => array(
+			'idle' => 'الخلاصات الخاملة',
+			'main' => 'الإحصاءات الرئيسية',
+			'repartition' => 'توزيع المقالات',
+			'unread_dates' => 'تواريخ غير المقروءة',
+		),
+		'subscription_management' => 'إدارة الاشتراكات',
+		'subscription_tools' => 'أدوات الاشتراك',
+	),
+	'tag' => array(
+		'auto_label' => 'إضافة هذه التسمية إلى المقالات الجديدة',
+		'name' => 'الاسم',
+		'new_name' => 'الاسم الجديد',
+		'old_name' => 'الاسم القديم',
+	),
+	'title' => array(
+		'_' => 'إدارة الاشتراكات',
+		'add' => 'إضافة خلاصة أو تصنيف',
+		'add_category' => 'إضافة تصنيف',
+		'add_dynamic_opml' => 'إضافة OPML ديناميكي',
+		'add_feed' => 'إضافة خلاصة',
+		'add_label' => 'إضافة تسمية',
+		'add_opml_category' => 'اسم تصنيف OPML',
+		'delete_label' => 'حذف هذه التسمية',
+		'feed_management' => 'إدارة خلاصات RSS',
+		'subscription_tools' => 'أدوات الاشتراك',
+	),
+);

+ 54 - 0
app/i18n/ar/user.php

@@ -0,0 +1,54 @@
+<?php
+
+/******************************************************************************
+ * Each entry of that file can be associated with a comment to indicate its   *
+ * state. When there is no comment, it means the entry is fully translated.   *
+ * The recognized comments are (comment matching is case-insensitive):        *
+ *   + TODO: the entry has never been translated.                             *
+ *   + DIRTY: the entry has been translated but needs to be updated.          *
+ *   + IGNORE: the entry does not need to be translated.                      *
+ * When a comment is not recognized, it is discarded.                         *
+ ******************************************************************************/
+
+return array(
+	'email' => array(
+		'feedback' => array(
+			'invalid' => 'عنوان البريد الإلكتروني هذا غير صالح.',
+			'required' => 'عنوان البريد الإلكتروني مطلوب.',
+		),
+		'validation' => array(
+			'change_email' => 'يمكنك تغيير عنوان بريدك الإلكتروني <a href="%s">في صفحة الملف الشخصي</a>.',
+			'email_sent_to' => 'أرسلنا إليك رسالة بريد إلكتروني على <strong>%s</strong>. يرجى اتباع تعليماتها للتحقق من عنوانك.',
+			'feedback' => array(
+				'email_failed' => 'تعذر إرسال رسالة بريد إلكتروني إليك بسبب خطأ في إعدادات الخادم.',
+				'email_sent' => 'تم إرسال رسالة بريد إلكتروني إلى عنوانك.',
+				'error' => 'فشل التحقق من عنوان البريد الإلكتروني.',
+				'ok' => 'تم التحقق من عنوان البريد الإلكتروني هذا.',
+				'unnecessary' => 'تم التحقق من عنوان البريد الإلكتروني هذا بالفعل.',
+				'wrong_token' => 'فشل التحقق من عنوان البريد الإلكتروني هذا بسبب رمز غير صحيح.',
+			),
+			'need_to' => 'تحتاج إلى التحقق من عنوان بريدك الإلكتروني قبل أن تتمكن من استخدام %s.',
+			'resend_email' => 'إعادة إرسال البريد الإلكتروني',
+			'title' => 'التحقق من عنوان البريد الإلكتروني',
+		),
+	),
+	'mailer' => array(
+		'email_need_validation' => array(
+			'body' => 'لقد سجلت للتو في %s، ولكنك ما زلت بحاجة إلى التحقق من عنوان بريدك الإلكتروني. للقيام بذلك، ما عليك سوى اتباع الرابط:',
+			'title' => 'تحتاج إلى التحقق من حسابك',
+			'welcome' => 'مرحبًا %s،',
+		),
+	),
+	'password' => array(
+		'invalid' => 'كلمة المرور غير صالحة.',
+	),
+	'tos' => array(
+		'feedback' => array(
+			'invalid' => 'يجب قبول شروط الخدمة لتتمكن من التسجيل.',
+		),
+	),
+	'username' => array(
+		'invalid' => 'اسم المستخدم هذا غير صالح.',
+		'taken' => 'اسم المستخدم هذا، %s، محجوز.',
+	),
+);

+ 1 - 0
app/i18n/az/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'İstifadə olunan CSP başlığı təhlükəsiz deyil və FreshRSS XSS hücumlarına qarşı həssas ola bilər. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Sənədləşməyə baxın</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/be/gen.php

@@ -198,6 +198,7 @@ return array(
 		'unsafe_csp_header' => 'Загаловак CSP, які выкарыстоўваецца, небяспечны, і FreshRSS можа быць уразлівай да атак XSS. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Паглядзіце дакументацыю</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/cs/gen.php

@@ -198,6 +198,7 @@ return array(
 		'unsafe_csp_header' => 'The CSP header in use is unsafe and FreshRSS may be vulnerable to XSS attacks. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">See documentation</a>',	// TODO
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/de/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'Der verwendete CSP-Header ist unsicher und FreshRSS könnte anfällig für XSS-Angriffe sein. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Siehe Dokumentation</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/el/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'Η επικεφαλίδα CSP που χρησιμοποιείται δεν είναι ασφαλής και το FreshRSS μπορεί να είναι ανασφαλές απέναντι σε επιθέσεις XSS. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Δείτε τις οδηγίες χρήσης</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/en-US/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'The CSP header in use is unsafe and FreshRSS may be vulnerable to XSS attacks. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">See documentation</a>',	// IGNORE
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/en/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'The CSP header in use is unsafe and FreshRSS may be vulnerable to XSS attacks. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">See documentation</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',
 		'az' => 'Azərbaycanca',
 		'be' => 'Беларуская',
 		'cs' => 'Čeština',

+ 1 - 0
app/i18n/es/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'La cabecera CSP en uso no es segura y FreshRSS puede ser vulnerable a ataques XSS. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Ver documentación</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/fa/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'سرآیند CSP فعلی امن نیست و FreshRSS ممکن است در برابر حملات XSS آسیب‌پذیر باشد. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">مستندات را ببینید</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/fi/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'Käytössä oleva CSP-otsikko on turvaton, ja FreshRSS saattaa olla altis XSS-hyökkäyksille. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Lisätietoja ohjeessa</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/fr/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'L’en-tête CSP utilisé n’est pas sécurisé et FreshRSS peut être vulnérable aux attaques XSS. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Voir la documentation</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/he/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'The CSP header in use is unsafe and FreshRSS may be vulnerable to XSS attacks. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">See documentation</a>',	// TODO
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/hu/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'A CSP fejléc használata nem biztonságos és a FreshRSS sebezhető lehet az XSS támadásokkal szemben. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Lásd dokumentáció</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/id/gen.php

@@ -182,6 +182,7 @@ return array(
 		'unsafe_csp_header' => 'Header CSP yang digunakan tidak aman dan FreshRSS mungkin rentan terhadap serangan XSS. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Lihat dokumentasi</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/it/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'L’header CSP attualmente utilizzato non è sicuro e quindi FreshRSS può essere vulnerabile ad attacchi XSS. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Vedi la documentazione</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/ja/gen.php

@@ -182,6 +182,7 @@ return array(
 		'unsafe_csp_header' => '使用中のCSPヘッダーは安全ではないため、FreshRSSがXSS攻撃に対して脆弱になる可能性があります。<a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">ドキュメント</a>を参照してください。',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/ko/gen.php

@@ -182,6 +182,7 @@ return array(
 		'unsafe_csp_header' => 'The CSP header in use is unsafe and FreshRSS may be vulnerable to XSS attacks. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">See documentation</a>',	// TODO
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/lt/gen.php

@@ -198,6 +198,7 @@ return array(
 		'unsafe_csp_header' => 'Naudojama CSP antraštė yra nesaugi, ir FreshRSS gali būti pažeidžiama XSS atakų. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Žr. dokumentaciją</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/lv/gen.php

@@ -198,6 +198,7 @@ return array(
 		'unsafe_csp_header' => 'The CSP header in use is unsafe and FreshRSS may be vulnerable to XSS attacks. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">See documentation</a>',	// TODO
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/nl/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'De gebruikte CSP-header is onveilig en FreshRSS kan kwetsbaar zijn voor XSS-aanvallen. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Zie documentatie</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/oc/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'The CSP header in use is unsafe and FreshRSS may be vulnerable to XSS attacks. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">See documentation</a>',	// TODO
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/pl/gen.php

@@ -198,6 +198,7 @@ return array(
 		'unsafe_csp_header' => 'Używany nagłówek CSP jest niebezpieczny i FreshRSS może być podatny na ataki XSS. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Zobacz dokumentację</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/pt-BR/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'O cabeçalho CSP em uso é inseguro e o FreshRSS pode ser vulnerável a ataques XSS. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Consulte a documentação</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/pt-PT/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'O cabeçalho CSP em utilização não é seguro e o FreshRSS pode estar vulnerável a ataques XSS. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Consultar a documentação</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/ru/gen.php

@@ -198,6 +198,7 @@ return array(
 		'unsafe_csp_header' => 'Используемый заголовок CSP небезопасен, и FreshRSS может быть уязвим для XSS-атак. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">См. документацию</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/sk/gen.php

@@ -198,6 +198,7 @@ return array(
 		'unsafe_csp_header' => 'The CSP header in use is unsafe and FreshRSS may be vulnerable to XSS attacks. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">See documentation</a>',	// TODO
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/tr/gen.php

@@ -190,6 +190,7 @@ return array(
 		'unsafe_csp_header' => 'Kullanılan CSP başlığı güvenli değil ve FreshRSS, XSS saldırılarına karşı savunmasız olabilir. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Belgelere bakın</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/uk/gen.php

@@ -198,6 +198,7 @@ return array(
 		'unsafe_csp_header' => 'Через використовуваний CSP-заголовок FreshRSS під загрозою XSS-атак. <a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">Переглянути документацію</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/zh-CN/gen.php

@@ -182,6 +182,7 @@ return array(
 		'unsafe_csp_header' => '当前使用的 CSP 头部不安全,FreshRSS 可能容易受到 XSS 攻击。<a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">查看文档</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE

+ 1 - 0
app/i18n/zh-TW/gen.php

@@ -184,6 +184,7 @@ return array(
 		'unsafe_csp_header' => '目前使用的 CSP 標頭不安全,FreshRSS 可能會受到 XSS 攻擊。<a target="_blank" href="https://freshrss.github.io/FreshRSS/en/admins/10_ServerConfig.html#security">請參閱說明文件</a>',
 	),
 	'lang' => array(
+		'ar' => 'العربية',	// IGNORE
 		'az' => 'Azərbaycanca',	// IGNORE
 		'be' => 'Беларуская',	// IGNORE
 		'cs' => 'Čeština',	// IGNORE