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

Add Persian/فارسی Language (#5571)

* Add Persian/فارسی  Language

* Fix i18n

* make fix-all
And several manual fixes

* Exclude Persian from English typo check

* Update CREDITS.md

I added myself to the list

* Credits alphabetic order

---------

Co-authored-by: AmirHossein <marjani@outlook.com>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
AmirHossein 2 лет назад
Родитель
Сommit
6d8a5429cb

+ 2 - 0
.typos.toml

@@ -17,6 +17,7 @@ extend-exclude = [
 	"app/i18n/cz/",
 	"app/i18n/de/",
 	"app/i18n/es/",
+	"app/i18n/fa/",
 	"app/i18n/fr/",
 	"app/i18n/he/",
 	"app/i18n/id/",
@@ -32,6 +33,7 @@ extend-exclude = [
 	"app/i18n/sk/",
 	"app/i18n/tr/",
 	"app/i18n/zh-cn/",
+	"app/i18n/zh-tw/",
 	"bin/",
 	"CHANGELOG-old.md",
 	"composer.lock",

+ 1 - 0
CREDITS.md

@@ -18,6 +18,7 @@ People are sorted by name so please keep this order.
 * [Alexis Degrugillier](https://github.com/aledeg): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:aledeg)
 * [Alwaysin](https://github.com/Alwaysin): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:Alwaysin)
 * [Amaury Carrade](https://github.com/AmauryCarrade): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:AmauryCarrade), [Web](https://amaury.carrade.eu/)
+* [AmirHossein Marjani](https://github.com/Marjani): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:Marjani)
 * [Amrul Izwan](https://github.com/amrulizwan): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:amrulizwan)
 * [Andrew Barrow](https://github.com/acbgbca): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:acbgbca)
 * [Andrew Hunter](https://github.com/rexbron): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:rexbron)

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',
 		'en-us' => 'English (United States)',
 		'es' => 'Español',
+		'fa' => 'فارسی',
 		'fr' => 'Français',
 		'he' => 'עברית',
 		'id' => 'Bahasa Indonesia',

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

+ 230 - 0
app/i18n/fa/admin.php

@@ -0,0 +1,230 @@
+<?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' => ' فرم وب (سنتی',
+		'http' => ' HTTP (برای کاربران پیشرفته با HTTPS)',
+		'none' => ' هیچ (خطرناک)',
+		'title' => ' احراز هویت',
+		'token' => ' نشانه احراز هویت',
+		'token_help' => ' امکان دسترسی به خروجی RSS کاربر پیش فرض بدون احراز هویت را می دهد:',
+		'type' => ' روش احراز هویت',
+		'unsafe_autologin' => ' اجازه ورود خودکار ناامن را با استفاده از قالب:',
+	),
+	'check_install' => array(
+		'cache' => array(
+			'nok' => ' مجوزهای دایرکتوری <em>./data/cache</em> را بررسی کنید. سرور HTTP باید مجوز نوشتن داشته باشد.',
+			'ok' => ' مجوزهای دایرکتوری کش خوب است.',
+		),
+		'categories' => array(
+			'nok' => ' جدول دسته بندی به درستی پیکربندی نشده است.',
+			'ok' => ' جدول رده درست است.',
+		),
+		'connection' => array(
+			'nok' => ' اتصال به پایگاه داده نمی تواند برقرار شود.',
+			'ok' => ' اتصال به پایگاه داده مشکلی ندارد.',
+		),
+		'ctype' => array(
+			'nok' => ' نمی توان یک کتابخانه مورد نیاز برای بررسی نوع کاراکتر (php-ctype) پیدا کرد.',
+			'ok' => ' شما کتابخانه مورد نیاز برای بررسی نوع کاراکتر (ctype) دارید.',
+		),
+		'curl' => array(
+			'nok' => ' نمی توان کتابخانه cURL (بسته php-curl) را پیدا کرد.',
+			'ok' => ' شما کتابخانه cURL را دارید.',
+		),
+		'data' => array(
+			'nok' => ' مجوزهای دایرکتوری <em>./data</em> را بررسی کنید. سرور HTTP باید مجوز نوشتن داشته باشد.',
+			'ok' => ' مجوزهای دایرکتوری داده ها خوب است.',
+		),
+		'database' => ' نصب پایگاه داده',
+		'dom' => array(
+			'nok' => ' نمی توان یک کتابخانه مورد نیاز برای مرور DOM (بسته php-xml) پیدا کرد.',
+			'ok' => ' شما کتابخانه مورد نیاز برای مرور DOM را دارید.',
+		),
+		'entries' => array(
+			'nok' => ' جدول ورودی به درستی پیکربندی نشده است.',
+			'ok' => ' جدول ورودی اشکالی ندارد.',
+		),
+		'favicons' => array(
+			'nok' => ' مجوزهای دایرکتوری <em>./data/favicons</em> را بررسی کنید. سرور HTTP باید مجوز نوشتن داشته باشد.',
+			'ok' => ' مجوزهای موجود در فهرست فاویکون ها خوب است.',
+		),
+		'feeds' => array(
+			'nok' => ' جدول خوراک به درستی پیکربندی نشده است.',
+			'ok' => ' جدول خوراک درست است.',
+		),
+		'fileinfo' => array(
+			'nok' => ' نمی توان کتابخانه اطلاعات فایل PHP (بسته اطلاعات فایل) را پیدا کرد.',
+			'ok' => ' شما کتابخانه fileinfo را دارید.',
+		),
+		'files' => ' نصب فایل',
+		'json' => array(
+			'nok' => ' JSON (بسته php-json) را نمی توان پیدا کرد.',
+			'ok' => ' شما پسوند JSON دارید.',
+		),
+		'mbstring' => array(
+			'nok' => ' نمی توان کتابخانه mbstring توصیه شده برای یونیکد را پیدا کرد.',
+			'ok' => ' شما کتابخانه mbstring توصیه شده برای یونیکد را دارید.',
+		),
+		'pcre' => array(
+			'nok' => ' نمی توان یک کتابخانه مورد نیاز برای عبارات منظم (php-pcre) پیدا کرد.',
+			'ok' => ' شما کتابخانه مورد نیاز برای عبارات منظم (PCRE) را دارید.',
+		),
+		'pdo' => array(
+			'nok' => ' PDO یا یکی از درایورهای پشتیبانی شده (pdo_mysql',
+			'ok' => ' شما دارای PDO و حداقل یکی از درایورهای پشتیبانی شده (pdo_mysql',
+		),
+		'php' => array(
+			'_' => ' نصب پی اچ پی',
+			'nok' => ' نسخه PHP شما %s است اما FreshRSS حداقل به نسخه %s نیاز دارد.',
+			'ok' => ' نسخه PHP شما (%s) با FreshRSS سازگار است.',
+		),
+		'tables' => array(
+			'nok' => ' یک یا چند جدول مفقود در پایگاه داده وجود دارد.',
+			'ok' => ' جداول مناسب در پایگاه داده وجود دارد.',
+		),
+		'title' => ' بررسی نصب',
+		'tokens' => array(
+			'nok' => ' مجوزهای دایرکتوری <em>./data/tokens</em> را بررسی کنید. سرور HTTP باید مجوز نوشتن داشته باشد',
+			'ok' => ' مجوزهای دایرکتوری توکن ها خوب است.',
+		),
+		'users' => array(
+			'nok' => ' مجوزهای فهرست <em>./data/users</em> را بررسی کنید. سرور HTTP باید مجوز نوشتن داشته باشد',
+			'ok' => ' مجوزهای دایرکتوری کاربران خوب است.',
+		),
+		'zip' => array(
+			'nok' => ' نمی توان پسوند ZIP (بسته php-zip) را پیدا کرد.',
+			'ok' => ' شما پسوند ZIP را دارید.',
+		),
+	),
+	'extensions' => array(
+		'author' => ' نویسنده',
+		'community' => ' پسوندهای جامعه موجود',
+		'description' => ' توضیحات',
+		'disabled' => ' معلول',
+		'empty_list' => ' هیچ برنامه افزودنی نصب شده ای وجود ندارد',
+		'enabled' => ' فعال است',
+		'latest' => ' نصب شده است',
+		'name' => ' نام',
+		'no_configure_view' => ' این برنامه افزودنی قابل پیکربندی نیست.',
+		'system' => array(
+			'_' => ' پسوندهای سیستم',
+			'no_rights' => ' پسوند سیستم (شما مجوزهای لازم را ندارید)',
+		),
+		'title' => ' برنامه های افزودنی',
+		'update' => ' به روز رسانی موجود است',
+		'user' => ' پسوندهای کاربر',
+		'version' => ' نسخه',
+	),
+	'stats' => array(
+		'_' => 'آمار',
+		'all_feeds' => ' همه فیدها',
+		'category' => ' دسته',
+		'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' => ' جریان اصلی',
+		'no_idle' => ' هیچ فید بیکار وجود ندارد!',
+		'number_entries' => ' %d مقاله',
+		'percent_of_total' => ' درصد از کل',
+		'repartition' => ' تقسیم مجدد مقالات',
+		'status_favorites' => ' موارد دلخواه',
+		'status_read' => ' بخوانید',
+		'status_total' => ' مجموع',
+		'status_unread' => ' خوانده نشده',
+		'title' => 'آمار',
+		'top_feed' => ' ده فید برتر',
+	),
+	'system' => array(
+		'_' => ' پیکربندی سیستم',
+		'auto-update-url' => ' به روز رسانی خودکار URL سرور',
+		'cookie-duration' => array(
+			'help' => ' در ثانیه',
+			'number' => ' مدت زمان ورود به سیستم',
+		),
+		'force_email_validation' => ' اعتبارسنجی آدرس ایمیل اجباری',
+		'instance-name' => ' نام نمونه',
+		'max-categories' => ' حداکثر تعداد دسته ها برای هر کاربر',
+		'max-feeds' => ' حداکثر تعداد فید برای هر کاربر',
+		'registration' => array(
+			'number' => ' حداکثر تعداد حساب ها',
+			'select' => array(
+				'label' => ' فرم ثبت نام',
+				'option' => array(
+					'noform' => ' معلولین: بدون فرم ثبت نام',
+					'nolimit' => ' فعال: بدون محدودیت حساب',
+					'setaccountsnumber' => ' حداکثر تنظیم کنید. تعداد حساب ها',
+				),
+			),
+			'status' => array(
+				'disabled' => ' فرم غیرفعال است',
+				'enabled' => ' فرم فعال است',
+			),
+			'title' => 'فرم ثبت نام کاربر',
+		),
+		'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>',
+		),
+	),
+	'update' => array(
+		'_' => ' FreshRSS را به روز کنید',
+		'apply' => ' شروع به روز رسانی',
+		'changelog' => ' تغییرات',
+		'check' => ' به روز رسانی های جدید را بررسی کنید',
+		'copiedFromURL' => 'update.php از %s به ./data کپی شد',
+		'current_version' => ' نسخه نصب شده فعلی',
+		'last' => ' آخرین بررسی',
+		'loading' => ' به روز رسانی…',
+		'none' => ' به روز رسانی در دسترس نیست',
+		'releaseChannel' => array(
+			'_' => ' کانال انتشار',
+			'edge' => ' انتشار نورد ("لبه")',
+			'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' => ' نام کاربری',
+	),
+);

+ 302 - 0
app/i18n/fa/conf.php

@@ -0,0 +1,302 @@
+<?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(
+		'_' => ' نمایش',
+		'darkMode' => array(
+			'_' => ' حالت تاریک خودکار (بتا)',
+			'auto' => ' خودکار',
+			'no' => ' شماره',
+		),
+		'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' => ' دکمه های ناوبری را نشان دهید',
+		'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' => ' قبلی',
+		),
+	),
+	'profile' => array(
+		'_' => ' مدیریت پروفایل',
+		'api' => ' مدیریت API',
+		'delete' => array(
+			'_' => ' حذف اکانت',
+			'warn' => ' حساب شما و تمام داده های مرتبط حذف خواهد شد.',
+		),
+		'email' => ' آدرس ایمیل',
+		'password_api' => ' رمز عبور API<br /><small>(مثلاً برای برنامه های تلفن همراه)</small>',
+		'password_form' => ' رمز عبور<br /><small>(برای روش ورود به فرم وب)</small>',
+		'password_format' => ' حداقل 7 کاراکتر',
+		'title' => ' نمایه',
+	),
+	'query' => array(
+		'_' => ' پرس و جوهای کاربر',
+		'deprecated' => ' این عبارت دیگر معتبر نیست. دسته یا فید ارجاع شده حذف شده است.',
+		'filter' => array(
+			'_' => ' فیلتر اعمال شده:',
+			'categories' => ' نمایش بر اساس دسته بندی',
+			'feeds' => ' نمایش با فید',
+			'order' => ' مرتب سازی بر اساس تاریخ',
+			'search' => ' بیان',
+			'state' => ' ایالت',
+			'tags' => ' نمایش بر اساس برچسب',
+			'type' => ' نوع',
+		),
+		'get_all' => ' نمایش همه مقالات',
+		'get_category' => ' دسته «%s» را نمایش دهید',
+		'get_favorite' => ' نمایش مقالات مورد علاقه',
+		'get_feed' => ' فید "%s" را نمایش دهید',
+		'name' => ' نام',
+		'no_filter' => ' بدون فیلتر',
+		'number' => ' پرس و جو n°%d',
+		'order_asc' => ' ابتدا قدیمی ترین مقالات را نمایش دهید',
+		'order_desc' => ' ابتدا جدیدترین مقالات را نمایش دهید',
+		'search' => ' «%s» را جستجو کنید',
+		'state_0' => 'نمایش همه مقالات',
+		'state_1' => 'نمایش مقالات خوانده شده',
+		'state_2' => 'نمایش مقالات خوانده نشده',
+		'state_3' => 'نمایش همه مقالات',
+		'state_4' => ' نمایش مقالات مورد علاقه',
+		'state_5' => ' نمایش مقالات مورد علاقه خوانده شده',
+		'state_6' => 'نمایش مقالات مورد علاقه خوانده نشده',
+		'state_7' => ' نمایش مقالات مورد علاقه',
+		'state_8' => ' نمایش مقالات مورد علاقه نیست',
+		'state_9' => ' نمایش مقالات مورد علاقه خوانده نشده',
+		'state_10' => ' نمایش مقالات خوانده نشده و نه مورد علاقه',
+		'state_11' => ' نمایش مقالات مورد علاقه نیست',
+		'state_12' => ' نمایش همه مقالات',
+		'state_13' => ' نمایش مقالات خوانده شده',
+		'state_14' => ' نمایش مقالات خوانده نشده',
+		'state_15' => ' نمایش همه مقالات',
+		'title' => ' پرس و جوهای کاربر',
+	),
+	'reading' => array(
+		'_' => ' خواندن',
+		'after_onread' => ' بعد از "علامت گذاری همه به عنوان خوانده شده"',
+		'always_show_favorites' => ' نمایش همه مقالات در موارد دلخواه به طور پیش فرض',
+		'article' => array(
+			'authors_date' => array(
+				'_' => ' نویسندگان و تاریخ',
+				'both' => ' در سرصفحه و پاورقی',
+				'footer' => ' در پاورقی',
+				'header' => ' در سربرگ',
+				'none' => ' هیچکدام',
+			),
+			'feed_name' => array(
+				'above_title' => ' بالای عنوان/برچسب ها',
+				'none' => ' هیچ',
+				'with_authors' => ' در نویسندگان و ردیف تاریخ',
+			),
+			'feed_title' => ' عنوان خوراک',
+			'tags' => array(
+				'_' => ' برچسب ها',
+				'both' => ' در سرصفحه و پاورقی',
+				'footer' => ' در پاورقی',
+				'header' => ' در سربرگ',
+				'none' => ' هیچ',
+			),
+			'tags_max' => array(
+				'_' => ' حداکثر تعداد برچسب نشان داده شده است',
+				'help' => '0 به این معنی است: همه برچسب ها را نشان دهید و آنها را جمع نکنید',
+			),
+		),
+		'articles_per_page' => ' تعداد مقاله در هر صفحه',
+		'auto_load_more' => ' مقالات بیشتری را در پایین صفحه بارگذاری کنید',
+		'auto_remove_article' => ' مخفی کردن مقالات پس از خواندن',
+		'confirm_enabled' => ' یک دیالوگ تأیید را روی اقدامات "علامت گذاری همه به عنوان خوانده شده" نمایش دهید',
+		'display_articles_unfolded' => ' نمایش مقالاتی که به طور پیش فرض باز شده اند',
+		'display_categories_unfolded' => ' دسته بندی هایی که باید آشکار شوند',
+		'headline' => array(
+			'articles' => ' مقالات: باز/بستن',
+			'articles_header_footer' => ' مقالات: سرصفحه / پاورقی',
+			'categories' => ' ناوبری چپ: دسته ها',
+			'mark_as_read' => ' مقاله را به عنوان خوانده شده علامت گذاری کنید',
+			'misc' => ' متفرقه',
+			'view' => ' مشاهده',
+		),
+		'hide_read_feeds' => ' دسته‌ها و فیدها را بدون مقاله خوانده نشده پنهان کنید (با پیکربندی «نمایش همه مقاله‌ها» کار نمی‌کند)',
+		'img_with_lazyload' => ' از حالت <em>بار تنبل</em> برای بارگیری تصاویر استفاده کنید',
+		'jump_next' => ' پرش به خواهر و برادر خوانده نشده بعدی (فید یا دسته)',
+		'mark_updated_article_unread' => ' مقالات به روز شده را به عنوان خوانده نشده علامت گذاری کنید',
+		'number_divided_when_reader' => ' در نمای خواندن بر 2 تقسیم کنید.',
+		'read' => array(
+			'article_open_on_website' => ' هنگامی که مقاله در وب سایت اصلی خود باز می شود',
+			'article_viewed' => ' هنگام مشاهده مقاله',
+			'keep_max_n_unread' => ' حداکثر تعداد مقالات خوانده نشده',
+			'scroll' => ' در حین پیمایش',
+			'upon_gone' => ' زمانی که دیگر در فید اخبار بالادستی نیست',
+			'upon_reception' => ' پس از دریافت مقاله',
+			'when' => ' علامت گذاری یک مقاله به عنوان خوانده شده…',
+			'when_same_title' => ' اگر عنوان یکسانی از قبل در <i>n</i> جدیدترین مقالات بالا وجود داشته باشد',
+		),
+		'show' => array(
+			'_' => ' مقالات برای نمایش',
+			'active_category' => ' دسته فعال',
+			'adaptive' => ' نمایش را تنظیم کنید',
+			'all_articles' => ' نمایش همه مقالات',
+			'all_categories' => ' همه دسته ها',
+			'no_category' => ' بدون دسته',
+			'remember_categories' => ' دسته بندی های باز را به خاطر بسپارید',
+			'unread' => ' فقط خوانده نشده را نشان دهد',
+		),
+		'show_fav_unread_help' => ' روی برچسب ها نیز اعمال می شود',
+		'sides_close_article' => ' با کلیک کردن خارج از ناحیه متن مقاله',
+		'sort' => array(
+			'_' => ' ترتیب مرتب سازی',
+			'newer_first' => ' ابتدا جدیدترین',
+			'older_first' => ' اول قدیمی ترین',
+		),
+		'sticky_post' => ' وقتی باز شد مقاله را به بالا بچسبانید',
+		'title' => ' خواندن',
+		'view' => array(
+			'default' => ' نمای پیش فرض',
+			'global' => ' نمای جهانی',
+			'normal' => ' نمای عادی',
+			'reader' => ' مشاهده خواندن',
+		),
+	),
+	'sharing' => array(
+		'_' => ' اشتراک گذاری',
+		'add' => ' یک روش اشتراک گذاری اضافه کنید',
+		'blogotext' => ' وبلاگ متن',
+		'deprecated' => ' این سرویس منسوخ شده است و در <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="باز کردن اسناد برای اطلاعات بیشتر" target= از FreshRSS حذف خواهد شد. "_blank">نسخه آینده</a>.',
+		'diaspora' => ' دیاسپورا*',
+		'email' => ' ایمیل',
+		'facebook' => ' فیس بوک',
+		'more_information' => ' اطلاعات بیشتر',
+		'print' => ' چاپ',
+		'raindrop' => ' Raindrop.io',
+		'remove' => ' روش اشتراک گذاری را حذف کنید',
+		'shaarli' => ' شعرلی',
+		'share_name' => ' نام اشتراک گذاری برای نمایش',
+		'share_url' => ' URL را برای استفاده به اشتراک بگذارید',
+		'title' => ' اشتراک گذاری',
+		'twitter' => ' توییتر',
+		'wallabag' => 'والباگ',
+	),
+	'shortcut' => array(
+		'_' => ' میانبرها',
+		'article_action' => ' اقدامات ماده',
+		'auto_share' => ' اشتراک گذاری',
+		'auto_share_help' => ' اگر فقط یک حالت اشتراک گذاری وجود داشته باشد',
+		'close_dropdown' => ' منوها را ببندید',
+		'collapse_article' => ' فروپاشی',
+		'first_article' => ' اولین مقاله را باز کنید',
+		'focus_search' => ' به کادر جستجو دسترسی پیدا کنید',
+		'global_view' => ' تغییر به نمای جهانی',
+		'help' => ' نمایش اسناد',
+		'javascript' => ' برای استفاده از میانبرها باید جاوا اسکریپت فعال باشد',
+		'last_article' => ' آخرین مقاله را باز کنید',
+		'load_more' => ' بارگذاری مقالات بیشتر',
+		'mark_favorite' => ' موارد دلخواه را تغییر دهید',
+		'mark_read' => ' خواندن را تغییر دهید',
+		'navigation' => ' ناوبری',
+		'navigation_help' => ' با اصلاح‌کننده <kbd>⇧ Shift</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_media' => ' پخش/مکث رسانه',
+		'user_filter' => ' به درخواست های کاربر دسترسی پیدا کنید',
+		'user_filter_help' => ' اگر فقط یک درخواست کاربر وجود داشته باشد',
+		'views' => ' بازدید',
+	),
+	'user' => array(
+		'articles_and_size' => '%s مقاله (%s)',
+		'current' => ' کاربر فعلی',
+		'is_admin' => ' مدیر است',
+		'users' => ' کاربران',
+	),
+);

+ 144 - 0
app/i18n/fa/feedback.php

@@ -0,0 +1,144 @@
+<?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 اکنون فعال است',
+		),
+		'no_access' => ' شما به %s دسترسی ندارید',
+		'not_enabled' => '%s فعال نیست',
+		'not_found' => '%s وجود ندارد',
+		'removed' => '%s حذف شد',
+	),
+	'import_export' => array(
+		'export_no_zip_extension' => ' پسوند ZIP در سرور شما وجود ندارد. لطفا سعی کنید فایل ها را یکی یکی صادر کنید.',
+		'feeds_imported' => ' فیدهای شما وارد شده اند و اکنون به روز خواهند شد',
+		'feeds_imported_with_errors' => ' فیدهای شما وارد شده است',
+		'file_cannot_be_uploaded' => ' فایل قابل آپلود نیست!',
+		'no_zip_extension' => ' پسوند ZIP در سرور شما وجود ندارد.',
+		'zip_error' => ' در حین پردازش ZIP خطایی روی داد.',
+	),
+	'profile' => array(
+		'error' => ' نمایه شما قابل تغییر نیست',
+		'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' => ' فید را نمی توان به روز کرد',
+			'internal_problem' => ' فید خبری اضافه نشد. برای جزئیات <a href="%s">گزارش‌های FreshRSS</a> را بررسی کنید. می‌توانید با اضافه کردن <code>#force_feed</code> به URL',
+			'invalid_url' => ' 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" ایجاد شده است.',
+		'name_exists' => ' نام برچسب از قبل وجود دارد.',
+		'renamed' => ' برچسب "%s" به "%s" تغییر نام داده است.',
+	),
+	'update' => array(
+		'can_apply' => ' به‌روزرسانی FreshRSS موجود است: <strong>نسخه %s</strong>.',
+		'error' => ' فرآیند به روز رسانی با خطا مواجه شده است: %s',
+		'file_is_nok' => ' به‌روزرسانی FreshRSS موجود است (<strong>نسخه %s</strong>)',
+		'finished' => ' به روز رسانی کامل شد!',
+		'none' => ' به روز رسانی در دسترس نیست',
+		'server_not_found' => ' سرور به روز رسانی یافت نمی شود. [%s]',
+	),
+	'user' => array(
+		'created' => array(
+			'_' => ' کاربر %s ایجاد شده است',
+			'error' => ' کاربر %s نمی تواند ایجاد شود',
+		),
+		'deleted' => array(
+			'_' => ' کاربر %s حذف شده است',
+			'error' => ' کاربر %s قابل حذف نیست',
+		),
+		'updated' => array(
+			'_' => ' کاربر %s به روز شده است',
+			'error' => ' کاربر %s به روز نشده است',
+		),
+	),
+);

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

@@ -0,0 +1,246 @@
+<?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' => '← به عقب برگرد',
+		'back_to_rss_feeds' => '← به فیدهای RSS خود برگردید',
+		'cancel' => ' لغو',
+		'create' => ' ایجاد کنید',
+		'delete_muted_feeds' => ' فیدهای خاموش را حذف کنید',
+		'demote' => ' تنزل دادن',
+		'disable' => ' غیر فعال کردن',
+		'empty' => ' خالی',
+		'enable' => ' فعال کنید',
+		'export' => ' صادرات',
+		'filter' => ' فیلتر',
+		'import' => ' واردات',
+		'load_default_shortcuts' => ' میانبرهای پیش فرض را بارگیری کنید',
+		'manage' => ' مدیریت',
+		'mark_read' => ' علامت گذاری به عنوان خوانده شده',
+		'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>',
+		),
+		'registration' => array(
+			'_' => ' حساب جدید',
+			'ask' => ' یک حساب کاربری ایجاد کنید؟',
+			'title' => ' ایجاد حساب',
+		),
+		'username' => array(
+			'_' => ' نام کاربری',
+			'format' => '<small>حداکثر 16 نویسه الفبای عددی</small>',
+		),
+	),
+	'date' => array(
+		'Apr' => '\\A\\p\\r\\i\\l',	// TODO
+		'Aug' => '\\A\\u\\g\\u\\s\\t',	// TODO
+		'Dec' => '\\D\\e\\c\\e\\m\\b\\e\\r',	// TODO
+		'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\y',	// TODO
+		'Jan' => '\\J\\a\\n\\u\\a\\r\\y',	// TODO
+		'Jul' => '\\J\\u\\l\\y',	// TODO
+		'Jun' => '\\J\\u\\n\\e',	// TODO
+		'Mar' => '\\M\\a\\r\\c\\h',	// TODO
+		'May' => '\\M\\a\\y',	// TODO
+		'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r',	// TODO
+		'Oct' => '\\O\\c\\t\\o\\b\\e\\r',	// TODO
+		'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',	// TODO
+		'apr' => ' آوریل',
+		'april' => ' آوریل',
+		'aug' => ' آگوست',
+		'august' => ' آگوست',
+		'before_yesterday' => ' قبل از دیروز',
+		'dec' => ' دسامبر',
+		'december' => ' دسامبر',
+		'feb' => ' فوریه',
+		'february' => ' فوریه',
+		'format_date' => 'j %s Y',	// TODO
+		'format_date_hour' => 'j %s Y \\a\\t H\\:i',	// TODO
+		'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',
+		'about' => 'درباره FreshRSS',
+	),
+	'js' => array(
+		'category_empty' => ' دسته خالی',
+		'confirm_action' => ' آیا مطمئن هستید که می خواهید این عمل را انجام دهید؟ نمی توان آن را لغو کرد!',
+		'confirm_action_feed_cat' => ' آیا مطمئن هستید که می خواهید این عمل را انجام دهید؟ موارد دلخواه و درخواست های کاربر مرتبط را از دست خواهید داد. نمی توان آن را لغو کرد!',
+		'feedback' => array(
+			'body_new_articles' => ' %%d مقاله جدید برای خواندن در FreshRSS وجود دارد.',
+			'body_unread_articles' => ' (خوانده نشده: %%d)',
+			'request_failed' => ' یک درخواست شکست خورده است',
+			'title_new_articles' => ' FreshRSS: مقالات جدید!',
+		),
+		'new_article' => 'مقالات جدیدی موجود است',
+		'should_be_activated' => ' جاوا اسکریپت باید فعال باشد',
+	),
+	'lang' => array(
+		'cz' => 'Čeština',	// IGNORE
+		'de' => 'Deutsch',	// IGNORE
+		'el' => 'Ελληνικά',	// IGNORE
+		'en' => 'English',	// IGNORE
+		'en-us' => 'English (United States)',	// IGNORE
+		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
+		'fr' => 'Français',	// IGNORE
+		'he' => 'עברית',	// IGNORE
+		'id' => 'Bahasa Indonesia',	// IGNORE
+		'it' => 'Italiano',	// IGNORE
+		'ja' => '日本語',	// IGNORE
+		'ko' => '한국어',	// IGNORE
+		'lv' => 'Latviešu',	// IGNORE
+		'nl' => 'Nederlands',	// IGNORE
+		'oc' => 'Occitan',	// IGNORE
+		'pl' => 'Polski',	// IGNORE
+		'pt-br' => 'Português (Brasil)',	// IGNORE
+		'ru' => 'Русский',	// IGNORE
+		'sk' => 'Slovenčina',	// IGNORE
+		'tr' => 'Türkçe',	// IGNORE
+		'zh-cn' => '简体中文',	// IGNORE
+		'zh-tw' => '正體中文',	// IGNORE
+	),
+	'menu' => array(
+		'about' => ' در مورد',
+		'account' => ' حساب',
+		'admin' => ' اداره',
+		'archiving' => ' آرشیو',
+		'authentication' => ' احراز هویت',
+		'check_install' => ' بررسی نصب',
+		'configuration' => ' پیکربندی',
+		'display' => 'نمایش',
+		'extensions' => ' برنامه های افزودنی',
+		'logs' => ' سیاهههای مربوط',
+		'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' => ' سال',
+	),
+	'share' => array(
+		'Known' => ' سایت های مبتنی بر شناخته شده',
+		'archiveORG' => ' archive.org',
+		'archivePH' => ' archive.ph',
+		'blogotext' => ' وبلاگ متن',
+		'buffer' => ' بافر',
+		'clipboard' => ' کلیپ بورد',
+		'diaspora' => ' دیاسپورا*',
+		'email' => ' ایمیل',
+		'email-webmail-firefox-fix' => ' ایمیل (وب میل - تعمیر برای فایرفاکس)',
+		'facebook' => ' فیس بوک',
+		'gnusocial' => ' گنو اجتماعی',
+		'jdh' => 'ژورنال دو هکر',
+		'lemmy' => ' لمی',
+		'linkding' => ' پیوند دادن',
+		'linkedin' => ' لینکدین',
+		'mastodon' => ' ماستودون',
+		'movim' => ' Movim',
+		'omnivore' => ' همه چیزخوار',
+		'pinboard' => ' پینبرد',
+		'pinterest' => ' پینترست',
+		'pocket' => ' جیبی',
+		'print' => ' چاپ',
+		'raindrop' => ' Raindrop.io',
+		'reddit' => ' Reddit',
+		'shaarli' => ' شعرلی',
+		'twitter' => ' توییتر',
+		'wallabag' => ' wallabag نسخه 1',
+		'wallabagv2' => ' wallabag نسخه 2',
+		'web-sharing-api' => ' اشتراک گذاری سیستم',
+		'whatsapp' => ' واتساپ',
+		'xing' => ' زینگ',
+	),
+	'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' => ' مقاله دیگری وجود ندارد',
+	),
+);

+ 76 - 0
app/i18n/fa/index.php

@@ -0,0 +1,76 @@
+<?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>',
+		'bugs_reports' => ' گزارش اشکال',
+		'credits' => ' اعتبار',
+		'credits_content' => ' برخی از عناصر طراحی از <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> می آیند',
+		'documentation' => ' اسناد و مدارک',
+		'freshrss_description' => ' FreshRSS یک جمع کننده و خواننده RSS خود میزبان است. این به شما امکان می دهد بدون نیاز به مرور از یک وب سایت به وب سایت دیگر',
+		'github' => ' <a href="https://github.com/FreshRSS/FreshRSS/issues">در Github</a>',
+		'license' => ' مجوز',
+		'project_website' => ' وب سایت پروژه',
+		'title' => ' در مورد',
+		'version' => ' نسخه',
+	),
+	'feed' => array(
+		'add' => ' لطفاً چند فید اضافه کنید.',
+		'empty' => ' هیچ مقاله ای برای نمایش وجود ندارد.',
+		'rss_of' => ' فید RSS %s',
+		'title' => ' جریان اصلی',
+		'title_fav' => ' موارد دلخواه',
+		'title_global' => ' نمای جهانی',
+	),
+	'log' => array(
+		'_' => ' سیاهههای مربوط',
+		'clear' => ' سیاهههای مربوط را پاک کنید',
+		'empty' => ' فایل لاگ خالی است',
+		'title' => ' سیاهههای مربوط',
+	),
+	'menu' => array(
+		'about' => ' درباره FreshRSS',
+		'before_one_day' => ' بزرگتر از یک روز',
+		'before_one_week' => ' بزرگتر از یک هفته',
+		'bookmark_query' => ' درخواست فعلی را نشانک‌گذاری کنید',
+		'favorites' => ' موارد دلخواه (%s)',
+		'global_view' => ' نمای جهانی',
+		'main_stream' => ' جریان اصلی',
+		'mark_all_read' => ' همه را به عنوان خوانده شده علامت گذاری کنید',
+		'mark_cat_read' => ' دسته را به عنوان خوانده شده علامت گذاری کنید',
+		'mark_feed_read' => ' فید را به عنوان خوانده شده علامت گذاری کنید',
+		'mark_selection_unread' => ' انتخاب را به عنوان خوانده نشده علامت گذاری کنید',
+		'newer_first' => ' ابتدا جدیدتر',
+		'non-starred' => ' موارد غیر مورد علاقه را نشان دهید',
+		'normal_view' => ' نمای عادی',
+		'older_first' => ' اول مسن ترین',
+		'queries' => ' پرس و جوهای کاربر',
+		'read' => ' نمایش خوانده شده',
+		'reader_view' => ' مشاهده خواندن',
+		'rss_view' => ' خوراک RSS',
+		'search_short' => ' جستجو',
+		'starred' => ' نمایش موارد دلخواه',
+		'stats' => ' آمار',
+		'subscription' => ' مدیریت اشتراک',
+		'tags' => ' برچسب های من',
+		'unread' => ' نمایش خوانده نشده',
+	),
+	'share' => ' به اشتراک بگذارید',
+	'tag' => array(
+		'related' => ' برچسب های مقاله',
+	),
+	'tos' => array(
+		'title' => ' شرایط خدمات',
+	),
+);

+ 136 - 0
app/i18n/fa/install.php

@@ -0,0 +1,136 @@
+<?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' => 'Complete installation',	// TODO
+		'fix_errors_before' => 'Please all fix errors before continuing to the next step.',	// TODO
+		'keep_install' => 'Keep previous configuration',	// TODO
+		'next_step' => 'Go to the next step',	// TODO
+		'reinstall' => 'Reinstall FreshRSS',	// TODO
+	),
+	'auth' => array(
+		'form' => 'Web form (traditional',
+		'http' => 'HTTP (for advanced users with HTTPS)',	// TODO
+		'none' => 'None (dangerous)',	// TODO
+		'password_form' => 'Password<br /><small>(for the Web-form login method)</small>',	// TODO
+		'password_format' => 'At least 7 characters',	// TODO
+		'type' => 'Authentication method',	// TODO
+	),
+	'bdd' => array(
+		'_' => 'Database',	// TODO
+		'conf' => array(
+			'_' => 'Database configuration',	// TODO
+			'ko' => 'Verify your database configuration.',	// TODO
+			'ok' => 'Database configuration has been saved.',	// TODO
+		),
+		'host' => 'Host',	// TODO
+		'password' => 'Database password',	// TODO
+		'prefix' => 'Table prefix',	// TODO
+		'type' => 'Type of database',	// TODO
+		'username' => 'Database username',	// TODO
+	),
+	'check' => array(
+		'_' => 'Checks',	// TODO
+		'already_installed' => 'We have detected that FreshRSS is already installed!',	// TODO
+		'cache' => array(
+			'nok' => 'Check permissions on the <em>%1$s</em> directory for <em>%2$s</em> user. The HTTP server must have write permission.',	// TODO
+			'ok' => 'Permissions on the cache directory are good.',	// TODO
+		),
+		'ctype' => array(
+			'nok' => 'Cannot find the required library for character type checking (php-ctype).',	// TODO
+			'ok' => 'You have the required library for character type checking (ctype).',	// TODO
+		),
+		'curl' => array(
+			'nok' => 'Cannot find the cURL library (php-curl package).',	// TODO
+			'ok' => 'You have the cURL library.',	// TODO
+		),
+		'data' => array(
+			'nok' => 'Check permissions on the <em>%1$s</em> directory for <em>%2$s</em> user. The HTTP server must have write permission.',	// TODO
+			'ok' => 'Permissions on the data directory are good.',	// TODO
+		),
+		'dom' => array(
+			'nok' => 'Cannot find the required library to browse the DOM.',	// TODO
+			'ok' => 'You have the required library to browse the DOM.',	// TODO
+		),
+		'favicons' => array(
+			'nok' => 'Check permissions on the <em>%1$s</em> directory for <em>%2$s</em> user. The HTTP server must have write permission.',	// TODO
+			'ok' => 'Permissions on the favicons directory are good.',	// TODO
+		),
+		'fileinfo' => array(
+			'nok' => 'Cannot find the PHP fileinfo library (fileinfo package).',	// TODO
+			'ok' => 'You have the fileinfo library.',	// TODO
+		),
+		'json' => array(
+			'nok' => 'Cannot find the recommended library to parse JSON.',	// TODO
+			'ok' => 'You have the recommended library to parse JSON.',	// TODO
+		),
+		'mbstring' => array(
+			'nok' => 'Cannot find the recommended library mbstring for Unicode.',	// TODO
+			'ok' => 'You have the recommended library mbstring for Unicode.',	// TODO
+		),
+		'pcre' => array(
+			'nok' => 'Cannot find the required library for regular expressions (php-pcre).',	// TODO
+			'ok' => 'You have the required library for regular expressions (PCRE).',	// TODO
+		),
+		'pdo' => array(
+			'nok' => 'Cannot find PDO or one of the supported drivers (pdo_mysql, pdo_sqlite, pdo_pgsql).',	// TODO
+			'ok' => 'You have PDO and at least one of the supported drivers (pdo_mysql, pdo_sqlite, pdo_pgsql).',	// TODO
+		),
+		'php' => array(
+			'nok' => 'Your PHP version is %s, but FreshRSS requires at least version %s.',	// TODO
+			'ok' => 'Your PHP version, %s, is compatible with FreshRSS.',	// TODO
+		),
+		'reload' => 'Check again',	// TODO
+		'tmp' => array(
+			'nok' => 'Check permissions on the <em>%1$s</em> directory for <em>%2$s</em> user. The HTTP server must have write permissions.',	// TODO
+			'ok' => 'Permissions on the temp directory are good.',	// TODO
+		),
+		'unknown_process_username' => 'unknown',	// TODO
+		'users' => array(
+			'nok' => 'Check permissions on the <em>%1$s</em> directory for <em>%2$s</em> user. The HTTP server must have write permissions.',	// TODO
+			'ok' => 'Permissions on the users directory are good.',	// TODO
+		),
+		'xml' => array(
+			'nok' => 'Cannot find the required library to parse XML.',	// TODO
+			'ok' => 'You have the required library to parse XML.',	// TODO
+		),
+	),
+	'conf' => array(
+		'_' => 'General configuration',	// TODO
+		'ok' => 'General configuration has been saved.',	// TODO
+	),
+	'congratulations' => 'Congratulations!',	// TODO
+	'default_user' => array(
+		'_' => 'Username of the default user',	// TODO
+		'max_char' => 'maximum 16 alphanumeric characters',	// TODO
+	),
+	'fix_errors_before' => 'Please fix errors before continuing to the next step.',	// TODO
+	'javascript_is_better' => 'FreshRSS is more pleasant with JavaScript enabled',	// TODO
+	'js' => array(
+		'confirm_reinstall' => 'You will lose your previous configuration by reinstalling FreshRSS. Are you sure you want to continue?',	// TODO
+	),
+	'language' => array(
+		'_' => 'Language',	// TODO
+		'choose' => 'Choose a language for FreshRSS',	// TODO
+		'defined' => 'Language has been defined.',	// TODO
+	),
+	'missing_applied_migrations' => 'Something went wrong; you should create an empty file <em>%s</em> manually.',	// TODO
+	'ok' => 'The installation process was successful.',	// TODO
+	'session' => array(
+		'nok' => 'The web server seems to be incorrectly configured for cookies required for PHP sessions!',	// TODO
+	),
+	'step' => 'step %d',	// TODO
+	'steps' => 'Steps',	// TODO
+	'this_is_the_end' => 'This is the end',	// TODO
+	'title' => 'Installation · FreshRSS',	// TODO
+);

+ 214 - 0
app/i18n/fa/sub.php

@@ -0,0 +1,214 @@
+<?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',
+	),
+	'bookmarklet' => array(
+		'documentation' => ' این دکمه را به نوار ابزار نشانک‌های خود بکشید یا روی آن راست کلیک کرده و «Bookmark This Link» را انتخاب کنید. سپس روی دکمه "اشتراک" در هر صفحه ای که می خواهید مشترک شوید کلیک کنید.',
+		'label' => ' مشترک شوید',
+		'title' => ' Bookmarklet',
+	),
+	'category' => array(
+		'_' => ' دسته',
+		'add' => ' یک دسته اضافه کنید',
+		'archiving' => ' بایگانی',
+		'dynamic_opml' => array(
+			'_' => ' OPML پویا',
+			'help' => ' URL را به <a href="http://opml.org/" target="_blank">فایل OPML</a> ارائه دهید تا به صورت پویا این دسته با فیدها پر شود.',
+		),
+		'empty' => ' دسته خالی',
+		'information' => ' اطلاعات',
+		'opml_url' => ' URL OPML',
+		'position' => ' موقعیت نمایش',
+		'position_help' => ' برای کنترل ترتیب مرتب سازی دسته بندی',
+		'title' => ' عنوان',
+	),
+	'feed' => array(
+		'accept_cookies' => ' کوکی ها را بپذیرید',
+		'accept_cookies_help' => ' به سرور فید اجازه دهید تا کوکی ها را تنظیم کند (فقط برای مدت زمان درخواست در حافظه ذخیره می شود)',
+		'add' => ' یک فید RSS اضافه کنید',
+		'advanced' => ' پیشرفته',
+		'archiving' => ' بایگانی',
+		'auth' => array(
+			'configuration' => ' ورود',
+			'help' => ' دسترسی به فیدهای RSS محافظت شده HTTP را می دهد',
+			'http' => ' احراز هویت HTTP',
+			'password' => ' رمز عبور HTTP',
+			'username' => ' نام کاربری HTTP',
+		),
+		'clear_cache' => ' همیشه حافظه پنهان را پاک کنید',
+		'content_action' => array(
+			'_' => ' اقدام محتوا هنگام واکشی محتوای مقاله',
+			'append' => ' پس از محتوای موجود اضافه کنید',
+			'prepend' => ' قبل از محتوای موجود اضافه کنید',
+			'replace' => ' محتوای موجود را جایگزین کنید',
+		),
+		'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',
+		),
+		'description' => ' توضیحات',
+		'empty' => ' این فید خالی است. لطفاً بررسی کنید که هنوز نگهداری می شود.',
+		'error' => ' این فید با مشکل مواجه شده است. لطفاً بررسی کنید که همیشه در دسترس است و سپس آن را به روز کنید.',
+		'filteractions' => array(
+			'_' => ' اعمال فیلتر',
+			'help' => ' در هر خط یک فیلتر جستجو بنویسید. اپراتورها <a href="https://freshrss.github.io/FreshRSS/en/users/10_filter.html#with-the-search-field" target="_blank">مستندات را ببینید</a>.',
+		),
+		'information' => ' اطلاعات',
+		'keep_min' => ' حداقل تعداد مقالات برای نگهداری',
+		'kind' => array(
+			'_' => ' نوع منبع خوراک',
+			'html_xpath' => array(
+				'_' => ' HTML + XPath (خراش دادن وب)',
+				'feed_title' => array(
+					'_' => ' عنوان خوراک',
+					'help' => ' مثال: <code>//title</code> یا یک رشته ثابت: <code>"فید سفارشی من"</code>',
+				),
+				'help' => '<dfn><a href="https://www.w3.org/TR/xpath-10/" target="_blank">XPath 1.0</a></dfn> یک زبان جستجوی استاندارد برای پیشرفته است کاربران',
+				'item' => array(
+					'_' => ' یافتن اخبار <strong>اقلام</strong><br /><small>(مهمترین)</small>',
+					'help' => ' مثال: <code>//div[@class="news-item"]</code>',
+				),
+				'item_author' => array(
+					'_' => ' نویسنده مورد',
+					'help' => ' همچنین می تواند یک رشته ثابت باشد. مثال: <code>"ناشناس"</code>',
+				),
+				'item_categories' => ' برچسب های آیتم',
+				'item_content' => array(
+					'_' => ' محتوای مورد',
+					'help' => ' مثالی برای گرفتن کامل مورد: <code>.</code>',
+				),
+				'item_thumbnail' => array(
+					'_' => ' تصویر کوچک مورد',
+					'help' => ' مثال: <code>فرزند::img/@src</code>',
+				),
+				'item_timeFormat' => array(
+					'_' => ' فرمت تاریخ/زمان سفارشی',
+					'help' => ' اختیاری. قالبی که توسط <a href="https://php.net/datetime.createfromformat" target="_blank"><code>DateTime::createFromFormat()</code></a> پشتیبانی می‌شود',
+				),
+				'item_timestamp' => array(
+					'_' => ' تاریخ مورد',
+					'help' => ' نتیجه با <a href="https://php.net/strtotime" target="_blank"><code>strtotime()</code></a> تجزیه خواهد شد',
+				),
+				'item_title' => array(
+					'_' => ' عنوان مورد',
+					'help' => ' به طور خاص از <a href="https://developer.mozilla.org/docs/Web/XPath/Axes" target="_blank">محور XPath</a> <code>فرزند::</code استفاده کنید > مانند <code>فرزند::h2</code>',
+				),
+				'item_uid' => array(
+					'_' => ' شناسه منحصر به فرد مورد',
+					'help' => ' اختیاری. مثال: <code>فرزند::div/@data-uri</code>',
+				),
+				'item_uri' => array(
+					'_' => ' پیوند مورد (URL)',
+					'help' => ' مثال: <code>فرزند::a/@href</code>',
+				),
+				'relative' => 'XPath (نسبت به مورد) برای:',
+				'xpath' => ' XPath برای:',
+			),
+			'rss' => ' RSS / Atom (پیش‌فرض)',
+			'xml_xpath' => ' XML + XPath',
+		),
+		'maintenance' => array(
+			'clear_cache' => ' کش را پاک کنید',
+			'clear_cache_help' => ' کش این فید را پاک کنید.',
+			'reload_articles' => ' بارگذاری مجدد مقالات',
+			'reload_articles_help' => ' تعداد زیادی مقاله را بارگیری مجدد کنید و در صورت تعریف انتخابگر',
+			'title' => ' تعمیر و نگهداری',
+		),
+		'max_http_redir' => ' حداکثر تغییر مسیر HTTP',
+		'max_http_redir_help' => ' روی 0 تنظیم کنید یا برای غیرفعال کردن آن را خالی بگذارید',
+		'moved_category_deleted' => ' هنگامی که یک دسته را حذف می کنید',
+		'mute' => ' بی صدا',
+		'no_selected' => ' هیچ خوراکی انتخاب نشده است.',
+		'number_entries' => ' %d مقاله',
+		'priority' => array(
+			'_' => ' دید',
+			'archived' => ' نشان داده نشود (بایگانی شده)',
+			'main_stream' => ' نمایش در جریان اصلی',
+			'normal' => ' نمایش در دسته بندی خود',
+		),
+		'proxy' => ' یک پروکسی برای واکشی این فید تنظیم کنید',
+		'proxy_help' => ' یک پروتکل (به عنوان مثال: SOCKS5) انتخاب کنید و آدرس پراکسی را وارد کنید (به عنوان مثال: <kbd>127.0.0.1:1080</kbd>)',
+		'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' => ' به‌طور خودکار بیشتر از آن رفرش نکنید',
+		'url' => ' URL فید',
+		'useragent' => ' عامل کاربر را برای واکشی این فید تنظیم کنید',
+		'useragent_help' => ' مثال: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',
+		'validator' => ' اعتبار خوراک را بررسی کنید',
+		'website' => ' آدرس وب سایت',
+		'websub' => ' اطلاع رسانی فوری با WebSub',
+	),
+	'import_export' => array(
+		'export' => ' صادرات',
+		'export_labelled' => ' مقالات برچسب دار خود را صادر کنید',
+		'export_opml' => ' لیست صادرات فیدها (OPML)',
+		'export_starred' => ' موارد دلخواه خود را صادر کنید',
+		'feed_list' => ' فهرست %s مقاله',
+		'file_to_import' => ' فایل برای وارد کردن<br />(OPML',
+		'file_to_import_no_zip' => ' فایل برای وارد کردن<br /> (OPML یا JSON)',
+		'import' => 'واردات',
+		'starred_list' => ' فهرست مقالات مورد علاقه',
+		'title' => ' واردات / صادرات',
+	),
+	'menu' => array(
+		'add' => ' یک فید یا دسته اضافه کنید',
+		'import_export' => ' واردات / صادرات',
+		'label_management' => ' مدیریت برچسب',
+		'stats' => array(
+			'idle' => ' تغذیه بیکار',
+			'main' => ' آمار اصلی',
+			'repartition' => ' تقسیم مجدد مقالات',
+		),
+		'subscription_management' => ' مدیریت اشتراک',
+		'subscription_tools' => 'ابزارهای اشتراک',
+	),
+	'tag' => array(
+		'name' => ' نام',
+		'new_name' => ' نام جدید',
+		'old_name' => ' نام قدیمی',
+	),
+	'title' => array(
+		'_' => ' مدیریت اشتراک',
+		'add' => ' یک فید یا دسته اضافه کنید',
+		'add_category' => ' یک دسته اضافه کنید',
+		'add_dynamic_opml' => ' OPML پویا را اضافه کنید',
+		'add_feed' => ' یک فید اضافه کنید',
+		'add_label' => ' یک برچسب اضافه کنید',
+		'delete_label' => ' یک برچسب را حذف کنید',
+		'feed_management' => ' فیدهای RSS را مدیریت می کندment',
+		'rename_label' => ' نام یک برچسب را تغییر دهید',
+		'subscription_tools' => 'ابزارهای اشتراک',
+	),
+);

+ 54 - 0
app/i18n/fa/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' => ' این نام کاربری',
+	),
+);

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE

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

@@ -144,6 +144,7 @@ return array(
 		'en' => 'English',	// IGNORE
 		'en-us' => 'English (United States)',	// IGNORE
 		'es' => 'Español',	// IGNORE
+		'fa' => 'فارسی',	// IGNORE
 		'fr' => 'Français',	// IGNORE
 		'he' => 'עברית',	// IGNORE
 		'id' => 'Bahasa Indonesia',	// IGNORE