Explorar el Código

Add Persian (fa) translations for FreshRSS (#7795)

* Add Persian (fa) translations for FreshRSS

* Fix Persian translation and syntax issues

* Apply fix-all for Persian translation2

* Fix syntax errors and update Persian translations

* Mark untranslated strings as IGNORE and fix remaining TODOs

* make fix-all

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Ali Moslemi hace 7 meses
padre
commit
084f954980

+ 10 - 10
app/i18n/fa/admin.php

@@ -16,11 +16,11 @@ return array(
 		'allow_anonymous_refresh' => ' اجازه بازخوانی ناشناس مقالات را بدهید',
 		'api_enabled' => ' اجازه دسترسی به <abbr>API</abbr> <small>(الزامی برای برنامه های تلفن همراه and sharing user queries and sharing user queries)</small>',	// DIRTY
 		'form' => ' فرم وب (سنتی',
-		'http' => 'HTTP (advanced: managed by Web server, OIDC, SSO…)',	// TODO
+		'http' => 'یک پروتکل ارتباطی است که برای انتقال داده‌ها ',
 		'none' => ' هیچ (خطرناک)',
 		'title' => ' احراز هویت',
-		'token' => 'Master authentication token',	// TODO
-		'token_help' => 'Allows access to all RSS outputs of the user as well as refreshing feeds without authentication:',	// TODO
+		'token' => 'به نوعی دارایی دیجیتال اشاره دارد که از ویژگی حفظ ارزش و انتقال به دیگران برخوردار است. توکن ابزار دیجیتالی است که بر روی بلاک چین رمزگذاری می‌شود. می‌توان گفت که توکن همان ارزدیجیتال با ویژگی‌های منحصر به فرد است.',
+		'token_help' => 'اجازه دسترسی به تمام خروجی های ار اس اس کاربر و همچنین به روزرسانی فید ها را بدون احراز هویت می دهد',
 		'type' => ' روش احراز هویت',
 		'unsafe_autologin' => ' اجازه ورود خودکار ناامن را با استفاده از قالب:',
 	),
@@ -116,7 +116,7 @@ return array(
 		'description' => ' توضیحات',
 		'disabled' => ' معلول',
 		'empty_list' => ' هیچ برنامه افزودنی نصب شده ای وجود ندارد',
-		'empty_list_help' => 'Check the logs to determine the reason behind the empty extension list.',	// TODO
+		'empty_list_help' => 'لاگ‌ها را بررسی کنید تا دلیل خالی بودن لیست افزونه‌ها مشخص شود',
 		'enabled' => ' فعال است',
 		'latest' => ' نصب شده است',
 		'name' => ' نام',
@@ -148,9 +148,9 @@ return array(
 		'main_stream' => ' جریان اصلی',
 		'no_idle' => ' هیچ فید بیکار وجود ندارد!',
 		'number_entries' => ' %d مقاله',
-		'overview' => 'Overview',	// TODO
+		'overview' => 'بررسی اجمالی',
 		'percent_of_total' => ' درصد از کل',
-		'repartition' => ' تقسیم مجدد مقالات: %s',	// DIRTY
+		'repartition' => 'تقسیم‌بندی مجدد',
 		'status_favorites' => ' موارد دلخواه',
 		'status_read' => ' بخوانید',
 		'status_total' => ' مجموع',
@@ -162,8 +162,8 @@ return array(
 		'_' => ' پیکربندی سیستم',
 		'auto-update-url' => ' به روز رسانی خودکار URL سرور',
 		'base-url' => array(
-			'_' => 'Base URL',	// TODO
-			'recommendation' => 'Automatic recommendation: <kbd>%s</kbd>',	// TODO
+			'_' => 'آدرس پایه',
+			'recommendation' => 'توصیه: <kbd>%s</kbd>',
 		),
 		'cookie-duration' => array(
 			'help' => ' در ثانیه',
@@ -189,14 +189,14 @@ return array(
 			),
 			'title' => 'فرم ثبت نام کاربر',
 		),
-		'sensitive-parameter' => 'Sensitive parameter. Edit manually in <kbd>./data/config.php</kbd>',	// TODO
+		'sensitive-parameter' => 'پارامتر حساس. Edit manually in <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' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+			'help' => ' در مورد <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">وب سایت</a>',
 		),
 	),
 	'update' => array(

+ 49 - 49
app/i18n/fa/conf.php

@@ -35,7 +35,7 @@ return array(
 		'darkMode' => array(
 			'_' => ' حالت تاریک خودکار',
 			'auto' => ' خودکار',
-			'help' => 'For compatible themes only',	// TODO
+			'help' => 'کمک',
 			'no' => ' شماره',
 		),
 		'icon' => array(
@@ -100,35 +100,35 @@ return array(
 		),
 	),
 	'mark_read_button' => array(
-		'_' => '"علامت گذاری همه به عنوان خوانده شده" button',	// DIRTY
-		'big' => 'Big',	// TODO
-		'none' => 'None',	// TODO
-		'small' => 'Small',	// TODO
+		'_' => '"علامت گذاری همه به عنوان خوانده شده" دکمه',
+		'big' => 'بزرگ',
+		'none' => 'هیچ',
+		'small' => 'کوچک',
 	),
 	'privacy' => array(
-		'_' => 'Privacy',	// TODO
-		'retrieve_extension_list' => 'Retrieve extension list',	// TODO
+		'_' => 'حریم خصوصی',
+		'retrieve_extension_list' => 'بازیابی لیست افزونه‌ها',
 	),
 	'profile' => array(
 		'_' => ' مدیریت پروفایل',
 		'api' => array(
 			'_' => ' مدیریت API',
-			'api_not_set' => 'API password not set',	// TODO
-			'api_set' => 'API password set',	// TODO
-			'check_link' => 'Check API status via: <kbd><a href="../api/" target="_blank">%s</a></kbd>',	// TODO
-			'disabled' => 'The API access is disabled.',	// TODO
-			'documentation_link' => 'See the <a href="https://freshrss.github.io/FreshRSS/en/users/06_Mobile_access.html#access-via-mobile-app" target="_blank">documentation and list of known apps</a>',	// TODO
-			'help' => 'See <a href="http://freshrss.github.io/FreshRSS/en/users/06_Mobile_access.html#access-via-mobile-app" target=_blank>documentation</a>',	// TODO
+			'api_not_set' => 'API تنظیم نشده',
+			'api_set' => 'API تنظیم شده',
+			'check_link' => 'بررسی وضعیت از طریق: <kbd><a href="../api/" target="_blank">%s</a></kbd>',
+			'disabled' => 'غیرفعال',
+			'documentation_link' => 'See the <a href="https://freshrss.github.io/FreshRSS/en/users/06_Mobile_access.html#access-via-mobile-app" target="_blank">مستندات و فهرست برنامه‌های شناخته‌شده</a>',	// IGNORE
+			'help' => 'See <a href="http://freshrss.github.io/FreshRSS/en/users/06_Mobile_access.html#access-via-mobile-app" target=_blank>documentation</a>',	// IGNORE
 		),
-		'change_password' => 'Change password',	// TODO
-		'confirm_new_password' => 'Confirm new password',	// TODO
-		'current_password' => 'Current password<br /><small>(for the Web-form login method)</small>',	// TODO
+		'change_password' => 'تغییر رمز عبور',
+		'confirm_new_password' => 'تأیید رمز عبور جدید',
+		'current_password' => 'رمز عبور کنونی<br /><small>(for the Web-form login method)</small>',
 		'delete' => array(
 			'_' => ' حذف اکانت',
 			'warn' => ' حساب شما و تمام داده های مرتبط حذف خواهد شد.',
 		),
 		'email' => ' آدرس ایمیل',
-		'new_password' => 'New password',	// TODO
+		'new_password' => 'رمز عبور جدید',
 		'password_api' => ' رمز عبور API<br /><small>(مثلاً برای برنامه های تلفن همراه)</small>',
 		'password_format' => ' حداقل 7 کاراکتر',
 		'title' => ' نمایه',
@@ -136,51 +136,51 @@ return array(
 	'query' => array(
 		'_' => ' پرس و جوهای کاربر',
 		'deprecated' => ' این عبارت دیگر معتبر نیست. دسته یا فید ارجاع شده حذف شده است.',
-		'description' => 'Description',	// TODO
+		'description' => 'توضیحات',
 		'filter' => array(
 			'_' => ' فیلتر اعمال شده:',
 			'categories' => ' نمایش بر اساس دسته بندی',
 			'feeds' => ' نمایش با فید',
 			'order' => ' مرتب سازی بر اساس تاریخ',
 			'search' => ' بیان',
-			'shareOpml' => 'Enable sharing by OPML of corresponding categories and feeds',	// TODO
-			'shareRss' => 'Enable sharing by HTML &amp; RSS',	// TODO
+			'shareOpml' => 'فعال‌سازی اشتراک‌گذاری دسته‌ها و فیدهای مربوطه با OPML',
+			'shareRss' => 'اشتراک‌گذاری RSS',
 			'state' => ' ایالت',
 			'tags' => ' نمایش بر اساس برچسب',
 			'type' => ' نوع',
 		),
-		'get_A' => 'Show all feeds, also those shown in their category',	// TODO
-		'get_Z' => 'Show all feeds, also archived ones',	// TODO
+		'get_A' => 'نمایش همه فیدها، از جمله فیدهایی که در دسته‌بندی خودشان نشان داده شده‌اند',
+		'get_Z' => 'نمایش همه فیدها، از جمله فیدهای بایگانی‌شده',
 		'get_all' => ' نمایش همه مقالات',
-		'get_all_labels' => 'Display articles with any label',	// TODO
+		'get_all_labels' => 'نمایش مقالات با هر برچسبی',
 		'get_category' => ' دسته «%s» را نمایش دهید',
 		'get_favorite' => ' نمایش مقالات مورد علاقه',
 		'get_feed' => ' فید "%s" را نمایش دهید',
-		'get_important' => 'Display articles from important feeds',	// TODO
-		'get_label' => 'Display articles with “%s” label',	// TODO
-		'help' => 'See the <a href="https://freshrss.github.io/FreshRSS/en/users/user_queries.html" target="_blank">documentation for user queries and resharing by HTML / RSS / OPML</a>.',	// TODO
-		'image_url' => 'Image URL',	// TODO
+		'get_important' => 'نمایش مقالات از فیدهای مهم',
+		'get_label' => 'نمایش مقالات با برچسب %s',
+		'help' => 'See the <a href="https://freshrss.github.io/FreshRSS/en/users/user_queries.html" target="_blank">مستندات مربوط به پرس‌وجوهای کاربران و بازنشر آن‌ها HTML / RSS / OPML</a>.',
+		'image_url' => 'نشانی اینترنتی تصویر',
 		'name' => ' نام',
 		'no_filter' => ' بدون فیلتر',
 		'no_queries' => array(
-			'_' => 'No user queries are saved yet.',	// TODO
-			'help' => 'See <a href="https://freshrss.github.io/FreshRSS/en/users/user_queries.html" target="_blank">documentation</a>',	// TODO
+			'_' => 'هنوز هیچ پرس‌وجوی کاربری ذخیره نشده است',
+			'help' => 'See <a href="https://freshrss.github.io/FreshRSS/en/users/user_queries.html" target="_blank">سند</a>',
 		),
 		'number' => ' پرس و جو n°%d',
 		'order_asc' => ' ابتدا قدیمی ترین مقالات را نمایش دهید',
 		'order_desc' => ' ابتدا جدیدترین مقالات را نمایش دهید',
 		'search' => ' «%s» را جستجو کنید',
 		'share' => array(
-			'_' => 'Share this query by link',	// TODO
+			'_' => 'اشتراک‌گذاری این پرس‌وجو از طریق لینک',
 			'disabled' => array(
-				'_' => 'disabled',	// TODO
-				'title' => 'Sharing',	// TODO
+				'_' => 'غیرفعال',
+				'title' => 'اشتراک‌گذاری',
 			),
-			'greader' => 'Shareable link to the GReader JSON',	// TODO
-			'help' => 'Give this link if you want to share this query with anyone',	// TODO
-			'html' => 'Shareable link to the HTML page',	// TODO
-			'opml' => 'Shareable link to the OPML list of feeds',	// TODO
-			'rss' => 'Shareable link to the RSS feed',	// TODO
+			'greader' => 'لینک قابل اشتراک‌گذاری برای JSON GReader',
+			'help' => 'اگر می‌خواهید این جستجو را با کسی به اشتراک بگذارید، این پیوند را بدهید',
+			'html' => 'لینک قابل اشتراک‌گذاری به صفحه HTML',
+			'opml' => 'لینک قابل اشتراک‌گذاری برای فهرست OPML فیدها',
+			'rss' => 'لینک قابل اشتراک‌گذاری برای فید RSS',
 		),
 		'state_0' => 'نمایش همه مقالات',
 		'state_1' => 'نمایش مقالات خوانده شده',
@@ -204,7 +204,7 @@ return array(
 		'_' => ' خواندن',
 		'after_onread' => ' بعد از "علامت گذاری همه به عنوان خوانده شده"',
 		'always_show_favorites' => ' نمایش همه مقالات در موارد دلخواه به طور پیش فرض',
-		'apply_to_individual_feed' => 'Applies to feeds individually',	// TODO
+		'apply_to_individual_feed' => 'به صورت جداگانه برای هر فید اعمال می‌شود',
 		'article' => array(
 			'authors_date' => array(
 				'_' => ' نویسندگان و تاریخ',
@@ -220,9 +220,9 @@ return array(
 			),
 			'feed_title' => ' عنوان خوراک',
 			'icons' => array(
-				'_' => 'Article icons position<br /><small>(Reading view only)</small>',	// TODO
-				'above_title' => 'Above title',	// TODO
-				'with_authors' => 'In authors and date row',	// TODO
+				'_' => 'موقعیت آیکون‌ها<br /><small>(Reading view only)</small>',
+				'above_title' => 'بالاتر از عنوان',
+				'with_authors' => 'در سطر نویسنده و تاریخ',
 			),
 			'tags' => array(
 				'_' => ' برچسب ها',
@@ -258,25 +258,25 @@ return array(
 		'read' => array(
 			'article_open_on_website' => ' هنگامی که مقاله در وب سایت اصلی خود باز می شود',
 			'article_viewed' => ' هنگام مشاهده مقاله',
-			'focus' => 'when focused (except for important feeds)',	// TODO
+			'focus' => 'فقط هنگام انتخاب فید (به‌جز فیدهای مهم)',
 			'keep_max_n_unread' => ' حداکثر تعداد مقالات خوانده نشده',
-			'scroll' => '(except for important feeds) در حین پیمایش',	// DIRTY
+			'scroll' => '(به‌جز فیدهای مهم) در حین پیمایش',
 			'upon_gone' => ' زمانی که دیگر در فید اخبار بالادستی نیست',
 			'upon_reception' => ' پس از دریافت مقاله',
 			'when' => ' علامت گذاری یک مقاله به عنوان خوانده شده…',
-			'when_same_title_in_category' => 'if an identical title already exists in the top <i>n</i> newest articles of the category',	// TODO
-			'when_same_title_in_feed' => ' اگر عنوان یکسانی از قبل در <i>n</i> جدیدترین مقالات بالا وجود داشته باشد (of the feed)',	// DIRTY
+			'when_same_title_in_category' => 'اگر عنوان مشابهی در بخش بالا وجود دارد <i>n</i> تازه‌ترین مقالات این دسته',
+			'when_same_title_in_feed' => ' اگر عنوان یکسانی از قبل در <i>n</i> جدیدترین مقالات بالا وجود داشته باشد (از فید)',
 		),
 		'show' => array(
 			'_' => ' مقالات برای نمایش',
 			'active_category' => ' دسته فعال',
-			'adaptive' => 'Show unreads if any, all articles otherwise',	// TODO
+			'adaptive' => 'اگر مقاله‌ای خوانده‌نشده موجود است، آن‌ها را نمایش دهد؛ در غیر این صورت، تمام مقالات را نشان دهد.',
 			'all_articles' => ' نمایش همه مقالات',
 			'all_categories' => ' همه دسته ها',
 			'no_category' => ' بدون دسته',
 			'remember_categories' => ' دسته بندی های باز را به خاطر بسپارید',
 			'unread' => ' فقط خوانده نشده را نشان دهد',
-			'unread_or_favorite' => 'Show unreads and favourites',	// TODO
+			'unread_or_favorite' => 'نمایش خوانده‌نشده‌ها و موردعلاقه‌ها',
 		),
 		'show_fav_unread_help' => ' روی برچسب ها نیز اعمال می شود',
 		'sides_close_article' => ' با کلیک کردن خارج از ناحیه متن مقاله',
@@ -286,7 +286,7 @@ return array(
 			'older_first' => ' اول قدیمی ترین',
 		),
 		'star' => array(
-			'when' => 'Mark an article as favourite…',	// TODO
+			'when' => 'یک مطلب را به عنوان مورد علاقه علامت‌گذاری کن...',
 		),
 		'sticky_post' => ' وقتی باز شد مقاله را به بالا بچسبانید',
 		'title' => ' خواندن',
@@ -300,7 +300,7 @@ return array(
 	'sharing' => array(
 		'_' => ' اشتراک گذاری',
 		'add' => ' یک روش اشتراک گذاری اضافه کنید',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky( یک شبکه اجتماعی غیرمتمرکز است که به کاربران اجازه می‌دهد پست‌های کوتاه، عکس و ویدیو به اشتراک بگذارند)',
 		'deprecated' => ' این سرویس منسوخ شده است و در <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="باز کردن اسناد برای اطلاعات بیشتر" target= از FreshRSS حذف خواهد شد. "_blank">نسخه آینده</a>.',
 		'diaspora' => ' دیاسپورا*',
 		'email' => ' ایمیل',

+ 8 - 8
app/i18n/fa/feedback.php

@@ -50,7 +50,7 @@ return array(
 			'ko' => ' %s را نمی توان فعال کرد. برای جزئیات <a href="%s">گزارش‌های FreshRSS</a> را بررسی کنید.',
 			'ok' => ' %s اکنون فعال است',
 		),
-		'invalid_view_mode' => 'Invalid view mode “%s”! Fall back to “Normal view”.',	// TODO
+		'invalid_view_mode' => 'حالت نمایشی که انتخاب کردی درست نیست! برمی‌گردم به حالت',
 		'no_access' => ' شما به %s دسترسی ندارید',
 		'not_enabled' => '%s فعال نیست',
 		'not_found' => '%s وجود ندارد',
@@ -58,15 +58,15 @@ return array(
 	),
 	'import_export' => array(
 		'export_no_zip_extension' => ' پسوند ZIP در سرور شما وجود ندارد. لطفا سعی کنید فایل ها را یکی یکی صادر کنید.',
-		'feeds_imported' => ' فیدهای شما وارد شده اند و اکنون به روز خواهند شد / Your feeds have been imported. If you are done importing, you can now click the <i>Update feeds</i> button.',	// DIRTY
-		'feeds_imported_with_errors' => ' فیدهای شما وارد شده است / Your feeds have been imported, but some errors occurred. If you are done importing, you can now click the <i>Update feeds</i> button.',	// DIRTY
+		'feeds_imported' => ' فیدهای شما وارد شده اند و اکنون به روز خواهند شد / Your feeds have been imported. If you are done importing, you can now click the <i>Update feeds</i> button.',
+		'feeds_imported_with_errors' => ' فیدهای شما وارد شده است / Your feeds have been imported, but some errors occurred. If you are done importing, you can now click the <i>Update feeds</i> button.',
 		'file_cannot_be_uploaded' => ' فایل قابل آپلود نیست!',
 		'no_zip_extension' => ' پسوند ZIP در سرور شما وجود ندارد.',
 		'zip_error' => ' در حین پردازش ZIP خطایی روی داد.',
 	),
 	'profile' => array(
 		'error' => ' نمایه شما قابل تغییر نیست',
-		'passwords_dont_match' => 'Passwords don’t match',	// TODO
+		'passwords_dont_match' => 'رمزهای عبور مطابقت ندارند',
 		'updated' => ' نمایه شما اصلاح شده است',
 	),
 	'sub' => array(
@@ -97,8 +97,8 @@ return array(
 			'deleted' => ' فید حذف شده است',
 			'error' => ' فید را نمی توان به روز کرد',
 			'favicon' => array(
-				'too_large' => 'Uploaded icon is too large. The maximum file size is <em>%s</em>.',	// TODO
-				'unsupported_format' => 'Unsupported image file format!',	// TODO
+				'too_large' => 'نماد آپلود شده خیلی بزرگ است. حداکثر حجم فایل <em>%s</em>.',
+				'unsupported_format' => 'فرمت فایل تصویری پشتیبانی نمی‌شود!',
 			),
 			'internal_problem' => ' فید خبری اضافه نشد. برای جزئیات <a href="%s">گزارش‌های FreshRSS</a> را بررسی کنید. می‌توانید با اضافه کردن <code>#force_feed</code> به URL',
 			'invalid_url' => ' URL <em>%s</em> نامعتبر است',
@@ -122,10 +122,10 @@ return array(
 	),
 	'tag' => array(
 		'created' => ' برچسب "%s" ایجاد شده است.',
-		'error' => 'Label could not be updated!',	// TODO
+		'error' => 'برچسب به‌روزرسانی نشد!',
 		'name_exists' => ' نام برچسب از قبل وجود دارد.',
 		'renamed' => ' برچسب "%s" به "%s" تغییر نام داده است.',
-		'updated' => 'Label has been updated.',	// TODO
+		'updated' => 'برچسب به‌روزرسانی شد.',
 	),
 	'update' => array(
 		'can_apply' => ' به‌روزرسانی FreshRSS موجود است: <strong>نسخه %s</strong>.',

+ 27 - 27
app/i18n/fa/gen.php

@@ -16,14 +16,14 @@ return array(
 		'add' => ' اضافه کنید',
 		'back_to_rss_feeds' => '← به فیدهای RSS خود برگردید',
 		'cancel' => ' لغو',
-		'close' => 'Close',	// TODO
+		'close' => 'بستن',
 		'create' => ' ایجاد کنید',
-		'delete_all_feeds' => 'Delete all feeds',	// TODO
-		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
+		'delete_all_feeds' => 'حذف تمام فیدها',
+		'delete_errored_feeds' => 'فیدهای دارای خطا را حذف کن',
 		'delete_muted_feeds' => ' فیدهای خاموش را حذف کنید',
 		'demote' => ' تنزل دادن',
 		'disable' => ' غیر فعال کردن',
-		'download' => 'Download',	// TODO
+		'download' => 'دانلود',
 		'empty' => ' خالی',
 		'enable' => ' فعال کنید',
 		'export' => ' صادرات',
@@ -33,12 +33,12 @@ return array(
 		'manage' => ' مدیریت',
 		'mark_read' => ' علامت گذاری به عنوان خوانده شده',
 		'menu' => array(
-			'open' => 'Open menu',	// TODO
+			'open' => 'باز کردن منو',
 		),
 		'nav_buttons' => array(
-			'next' => 'Next article',	// TODO
-			'prev' => 'Previous article',	// TODO
-			'up' => 'Go up',	// TODO
+			'next' => 'مقاله بعدی',
+			'prev' => 'مقاله قبلی',
+			'up' => 'برو بالا',
 		),
 		'open_url' => ' URL را باز کنید',
 		'promote' => ' ترویج',
@@ -62,9 +62,9 @@ return array(
 			'format' => '<small>حداقل 7 نویسه</small>',
 		),
 		'reauth' => array(
-			'header' => 'Reauthentication is required',	// TODO
-			'tip' => 'You won’t be asked to sign in again for <u>%d minutes</u>',	// TODO
-			'title' => 'Reauthentication',	// TODO
+			'header' => 'احراز هویت مجدد لازم است',
+			'tip' => 'دیگر از شما خواسته نمی‌شود که دوباره وارد شوید <u>%d دقیقه</u>',
+			'title' => 'ورود مجدد',
 		),
 		'registration' => array(
 			'_' => ' حساب جدید',
@@ -77,18 +77,18 @@ return array(
 		),
 	),
 	'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' => 'آ/و/ر/ی/ل//',
+		'Aug' => 'آ/گ/و/س/ت//',
+		'Dec' => 'د/س/ا/م/ب/ر//',
+		'Feb' => 'ف/و/ر/ی/ه//',
+		'Jan' => 'ژ/ا/ن/و/ی/ه//',
+		'Jul' => 'ژ/و/ئ/ی/ه//',
+		'Jun' => 'ژ/و/ئ/ن//',
+		'Mar' => 'م/ا/ر/س//',
+		'May' => 'م/ی//',
+		'Nov' => 'ن/و/ا/م/ب/ر//',
+		'Oct' => 'ا/ک/ت/ب/ر//',
+		'Sep' => 'س/پ/ت/ا/م/ب/ر//',
 		'apr' => ' آوریل',
 		'april' => ' آوریل',
 		'aug' => ' آگوست',
@@ -98,8 +98,8 @@ return array(
 		'december' => ' دسامبر',
 		'feb' => ' فوریه',
 		'february' => ' فوریه',
-		'format_date' => 'j %s Y',	// TODO
-		'format_date_hour' => 'j %s Y \\a\\t H\\:i',	// TODO
+		'format_date' => 'j %s Y',	// IGNORE
+		'format_date_hour' => 'j %s Y \\a\\t H\\:i',	// IGNORE
 		'fri' => ' جمعه',
 		'jan' => ' ژانویه',
 		'january' => ' ژانویه',
@@ -151,7 +151,7 @@ return array(
 			'request_failed' => ' یک درخواست شکست خورده است',
 			'title_new_articles' => ' FreshRSS: مقالات جدید!',
 		),
-		'labels_empty' => 'No labels',	// TODO
+		'labels_empty' => 'بدون برچسب',
 		'new_article' => 'مقالات جدیدی موجود است',
 		'should_be_activated' => ' جاوا اسکریپت باید فعال باشد',
 	),
@@ -194,7 +194,7 @@ return array(
 		'display' => 'نمایش',
 		'extensions' => ' برنامه های افزودنی',
 		'logs' => ' سیاهههای مربوط',
-		'privacy' => 'Privacy',	// TODO
+		'privacy' => 'حریم خصوصی',
 		'queries' => ' پرس و جوهای کاربر',
 		'reading' => ' خواندن',
 		'search' => ' کلمات یا #برچسب ها را جستجو کنید',

+ 25 - 25
app/i18n/fa/index.php

@@ -16,13 +16,13 @@ return array(
 		'agpl3' => ' <a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
 		'bug_reports' => array(
 			'environment_information' => array(
-				'_' => 'System information',	// TODO
-				'browser' => 'Browser',	// TODO
-				'database' => 'Database',	// TODO
-				'server_software' => 'Server software',	// TODO
-				'version_curl' => 'cURL version',	// TODO
-				'version_frss' => 'FreshRSS version',	// TODO
-				'version_php' => 'PHP version',	// TODO
+				'_' => ' اطلاعات سیستم',
+				'browser' => 'مرورگر',
+				'database' => 'پایگاه داده',
+				'server_software' => 'نرم‌افزار سرور',
+				'version_curl' => 'نسخه cURL',
+				'version_frss' => 'سخه FreshRSS',
+				'version_php' => 'نسخه PHP',
 			),
 		),
 		'bugs_reports' => ' گزارش اشکال',
@@ -37,9 +37,9 @@ return array(
 	'feed' => array(
 		'empty' => ' هیچ مقاله ای برای نمایش وجود ندارد.',
 		'received' => array(
-			'before_yesterday' => 'Received before yesterday',	// TODO
-			'today' => 'Received today',	// TODO
-			'yesterday' => 'Received yesterday',	// TODO
+			'before_yesterday' => 'پیش از دیروز دریافت شد',
+			'today' => 'امروز دریافت شد',
+			'yesterday' => 'دیروز دریافت شد',
 		),
 		'rss_of' => ' فید RSS %s',
 		'title' => ' جریان اصلی',
@@ -59,7 +59,7 @@ return array(
 		'bookmark_query' => ' درخواست فعلی را نشانک‌گذاری کنید',
 		'favorites' => ' موارد دلخواه (%s)',
 		'global_view' => ' نمای جهانی',
-		'important' => 'Important feeds',	// TODO
+		'important' => 'فیدهای مهم',
 		'main_stream' => ' جریان اصلی',
 		'mark_all_read' => ' همه را به عنوان خوانده شده علامت گذاری کنید',
 		'mark_cat_read' => ' دسته را به عنوان خوانده شده علامت گذاری کنید',
@@ -76,24 +76,24 @@ return array(
 		'rss_view' => ' خوراک RSS',
 		'search_short' => ' جستجو',
 		'sort' => array(
-			'_' => 'Sorting criteria',	// TODO
+			'_' => 'معیارهای مرتب‌سازی',
 			'c' => array(
-				'name_asc' => 'Category, feed titles A→Z',	// TODO
-				'name_desc' => 'Category, feed titles Z→A',	// TODO
+				'name_asc' => 'دسته بندی، عناوین فید A→Z',
+				'name_desc' => 'دسته بندی، عناوین فید Z→A',
 			),
-			'date_asc' => 'Publication date 1→9',	// TODO
-			'date_desc' => 'Publication date 9→1',	// TODO
+			'date_asc' => 'تاریخ انتشار ۱→۹',
+			'date_desc' => 'تاریخ انتشار ۹→۱',
 			'f' => array(
-				'name_asc' => 'Feed title A→Z',	// TODO
-				'name_desc' => 'Feed title Z→A',	// TODO
+				'name_asc' => 'عنوان فید A→Z',
+				'name_desc' => 'عنوان فید Z→A',
 			),
-			'id_asc' => 'Freshly received last',	// TODO
-			'id_desc' => 'Freshly received first',	// TODO
-			'link_asc' => 'Link A→Z',	// TODO
-			'link_desc' => 'Link Z→A',	// TODO
-			'rand' => 'Random order',	// TODO
-			'title_asc' => 'Title A→Z',	// TODO
-			'title_desc' => 'Title Z→A',	// TODO
+			'id_asc' => 'آخرین مورد، به تازه گی دریافت شد',
+			'id_desc' => 'نخستین مورد دریافت‌شده به تازگی',
+			'link_asc' => 'لینک A→Z',
+			'link_desc' => 'لینک Z→A',
+			'rand' => 'ترتیب تصادفی',
+			'title_asc' => 'عنوانA→Z',
+			'title_desc' => 'عنوان Z→A',
 		),
 		'starred' => ' نمایش موارد دلخواه',
 		'stats' => ' آمار',

+ 67 - 67
app/i18n/fa/install.php

@@ -12,117 +12,117 @@
 
 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
+		'finish' => 'مراحل نصب به پایان رسید',
+		'fix_errors_before' => 'لطفاً تمام خطاها را قبل از رفتن به مرحله بعد برطرف کنید.',
+		'keep_install' => 'پیکربندی قبلی را حفظ کنید',
+		'next_step' => 'به مرحله بعد بروید',
+		'reinstall' => 'نصب مجدد FreshRSS',
 	),
 	'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
+			'_' => 'پیکربندی پایگاه داده',
+			'ko' => 'یکربندی پایگاه داده خود را تأیید کنید.',
+			'ok' => 'تنظیمات پایگاه داده ذخیره شد.',
+		),
+		'host' => 'هاست',
+		'password' => 'رمز عبور پایگاه داده',
+		'prefix' => 'پیشوند جدول',
+		'type' => 'نوع پایگاه داده',
+		'username' => 'نام کاربری پایگاه داده',
 	),
 	'check' => array(
-		'_' => 'Checks',	// TODO
-		'already_installed' => 'We have detected that FreshRSS is already installed!',	// TODO
+		'_' => 'بررسی‌ها',
+		'already_installed' => 'ما تشخیص دادم FreshRSS قبلا نصب شده',
 		'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
+			'nok' => 'بررسی مجوزها در <em>%1$s</em> دایرکتوری برای <em>%2$s</em> کاربر.سرور وب نیاز به دسترسی نوشتن دارد',
+			'ok' => 'مجوزهای موجود در فهرست حافظه پنهان خوب است.',
 		),
 		'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
+			'nok' => 'کتابخانه مورد نیاز برای بررسی نوع کاراکتر (php-ctype) را نمی‌توان پیدا کرد.',
+			'ok' => 'شما کتابخانه مورد نیاز برای بررسی نوع کاراکتر (ctype) را دارید.',
 		),
 		'curl' => array(
-			'nok' => 'Cannot find the cURL library (php-curl package).',	// TODO
-			'ok' => 'You have the cURL library.',	// TODO
+			'nok' => 'کتابخانه cURL (بسته php-curl)را نمی‌تواند پیدا کند.',
+			'ok' => 'شما کتابخانه cURL را دارید.',
 		),
 		'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
+			'nok' => 'مجوزهای دایرکتوری <em>%1$s</em> را برای کاربر <em>%2$s</em> بررسی کنید. سرور HTTP باید مجوز نوشتن داشته باشد.',
+			'ok' => 'مجوزهای مربوط به دایرکتوری داده خوب است.',
 		),
 		'dom' => array(
-			'nok' => 'Cannot find the required library to browse the DOM.',	// TODO
-			'ok' => 'You have the required library to browse the DOM.',	// TODO
+			'nok' => 'کتابخانه مورد نیاز برای مرور DOM را نمی‌توان پیدا کرد.',
+			'ok' => 'شما کتابخانه مورد نیاز برای مرور DOM را دارید.',
 		),
 		'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
+			'nok' => 'مجوزهای دایرکتوری <em>%1$s</em> را برای کاربر <em>%2$s</em> بررسی کنید. سرور HTTP باید مجوز نوشتن داشته باشد.',
+			'ok' => 'دسترسی‌ها به پوشه‌ی favicons خوب است.',
 		),
 		'fileinfo' => array(
-			'nok' => 'Cannot find the PHP fileinfo library (fileinfo package).',	// TODO
-			'ok' => 'You have the fileinfo library.',	// TODO
+			'nok' => 'نمی‌توانم کتابخانه‌ی PHP fileinfo (بسته‌ی fileinfo) را پیدا کنم.',
+			'ok' => 'شما کتابخانه fileinfo را دارید.',
 		),
 		'json' => array(
-			'nok' => 'Cannot find the recommended library to parse JSON.',	// TODO
-			'ok' => 'You have the recommended library to parse JSON.',	// TODO
+			'nok' => 'کتابخانه پیشنهادی برای تجزیه JSON پیدا نشد.',
+			'ok' => 'شما کتابخانه پیشنهادی برای تجزیه JSON را دارید.',
 		),
 		'mbstring' => array(
-			'nok' => 'Cannot find the recommended library mbstring for Unicode.',	// TODO
-			'ok' => 'You have the recommended library mbstring for Unicode.',	// TODO
+			'nok' => 'کتابخانه ضروری mbstring جهت پشتیبانی از یونیکد پیدا نشد',
+			'ok' => 'کتابخانه توصیه شده mbstring برای یونیکد روی سیستم شما نصب است.',
 		),
 		'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
+			'nok' => 'کتابخانه مورد نیاز برای عبارات منظم (php-pcre) را نمی‌توان پیدا کرد',
+			'ok' => 'شما کتابخانه مورد نیاز برای عبارات منظم (PCRE) را دارید.',
 		),
 		'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
+			'nok' => 'نمی‌توان PDO یا یکی از درایورهای پشتیبانی‌شده (pdo_mysql، pdo_sqlite، pdo_pgsql) را پیدا کرد.',
+			'ok' => 'شما PDO و حداقل یکی از درایورهای پشتیبانی شده (pdo_mysql، pdo_sqlite، pdo_pgsql) را دارید.',
 		),
 		'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
+			'nok' => 'نسخه PHP شما %s است، اما FreshRSS حداقل به نسخه %s نیاز دارد.',
+			'ok' => 'نسخه PHP شما، %s، با FreshRSS سازگار است.',
 		),
-		'reload' => 'Check again',	// TODO
+		'reload' => 'دوباره بررسی کنید',
 		'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
+			'nok' => 'مجوزهای دایرکتوری <em>%1$s</em> را برای کاربر <em>%2$s</em> بررسی کنید. سرور HTTP باید مجوزهای نوشتن داشته باشد.',
+			'ok' => 'مجوزهای مربوط به دایرکتوری موقت خوب است.',
 		),
-		'unknown_process_username' => 'unknown',	// TODO
+		'unknown_process_username' => 'ناشناخته',
 		'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
+			'nok' => 'مجوزهای دایرکتوری <em>%1$s</em> را برای کاربر <em>%2$s</em> بررسی کنید. سرور HTTP باید مجوزهای نوشتن داشته باشد.',
+			'ok' => 'مجوزهای مربوط به دایرکتوری کاربران خوب است.',
 		),
 		'xml' => array(
-			'nok' => 'Cannot find the required library to parse XML.',	// TODO
-			'ok' => 'You have the required library to parse XML.',	// TODO
+			'nok' => 'کتابخانه مورد نیاز برای تجزیه XML پیدا نمی‌شود.',
+			'ok' => 'شما کتابخانه مورد نیاز برای تجزیه XML را دارید.',
 		),
 	),
 	'conf' => array(
-		'_' => 'General configuration',	// TODO
-		'ok' => 'General configuration has been saved.',	// TODO
+		'_' => 'پیکربندی عمومی',
+		'ok' => 'پیکربندی عمومی ذخیره شده است.',
 	),
-	'congratulations' => 'Congratulations!',	// TODO
+	'congratulations' => 'تبریک می‌گویم!',
 	'default_user' => array(
-		'_' => 'Username of the default user',	// TODO
-		'max_char' => 'maximum 16 alphanumeric characters',	// TODO
+		'_' => 'نام کاربری کاربر پیش‌فرض',
+		'max_char' => 'حداکثر ۱۶ کاراکتر الفبایی-عددی',
 	),
-	'fix_errors_before' => 'Please fix errors before continuing to the next step.',	// TODO
-	'javascript_is_better' => 'FreshRSS is more pleasant with JavaScript enabled',	// TODO
+	'fix_errors_before' => 'لطفا قبل از رفتن به مرحله بعدی، خطاها را برطرف کنید.',
+	'javascript_is_better' => 'FreshRSS با فعال بودن جاوا اسکریپت، کار امد تر است.',
 	'js' => array(
-		'confirm_reinstall' => 'You will lose your previous configuration by reinstalling FreshRSS. Are you sure you want to continue?',	// TODO
+		'confirm_reinstall' => 'با نصب مجدد FreshRSS، تنظیمات قبلی خود را از دست خواهید داد. آیا مطمئن هستید که می‌خواهید ادامه دهید؟',
 	),
 	'language' => array(
-		'_' => 'Language',	// TODO
-		'choose' => 'Choose a language for FreshRSS',	// TODO
-		'defined' => 'Language has been defined.',	// TODO
+		'_' => 'زبان',
+		'choose' => 'یک زبان برای FreshRSS انتخاب کنید',
+		'defined' => 'زبان تعریف شده است.',
 	),
-	'missing_applied_migrations' => 'Something went wrong; you should create an empty file <em>%s</em> manually.',	// TODO
-	'ok' => 'The installation process was successful.',	// TODO
+	'missing_applied_migrations' => 'مشکلی پیش آمده است؛ شما باید یک فایل خالی <em>%s</em> به صورت دستی ایجاد کنید.',
+	'ok' => 'مراحل نصب با موفقیت انجام شد.',
 	'session' => array(
-		'nok' => 'The web server seems to be incorrectly configured for cookies required for PHP sessions!',	// TODO
+		'nok' => 'به نظر می‌رسد وب سرور برای کوکی‌های مورد نیاز برای جلسات PHP به طور نادرست پیکربندی شده است!',
 	),
-	'step' => 'step %d',	// TODO
-	'steps' => 'Steps',	// TODO
-	'this_is_the_end' => 'This is the end',	// TODO
-	'title' => 'Installation · FreshRSS',	// TODO
+	'step' => 'مرحله %d',
+	'steps' => 'مراحل',
+	'this_is_the_end' => 'پایان',
+	'title' => 'نصب · FreshRSS',
 );

+ 58 - 58
app/i18n/fa/sub.php

@@ -29,9 +29,9 @@ return array(
 			'help' => ' URL را به <a href="http://opml.org/" target="_blank">فایل OPML</a> ارائه دهید تا به صورت پویا این دسته با فیدها پر شود.',
 		),
 		'empty' => ' دسته خالی',
-		'expand' => 'Expand category',	// TODO
+		'expand' => 'دسته‌بندی را گسترش دهید',
 		'information' => ' اطلاعات',
-		'open' => 'Open category',	// TODO
+		'open' => 'دسته‌بندی باز',
 		'opml_url' => ' URL OPML',
 		'position' => ' موقعیت نمایش',
 		'position_help' => ' برای کنترل ترتیب مرتب سازی دسته بندی',
@@ -50,7 +50,7 @@ return array(
 			'password' => ' رمز عبور HTTP',
 			'username' => ' نام کاربری HTTP',
 		),
-		'change_favicon' => 'Change…',	// TODO
+		'change_favicon' => 'تغییر…',
 		'clear_cache' => ' همیشه حافظه پنهان را پاک کنید',
 		'content_action' => array(
 			'_' => ' اقدام محتوا هنگام واکشی محتوای مقاله',
@@ -58,7 +58,7 @@ return array(
 			'prepend' => ' قبل از محتوای موجود اضافه کنید',
 			'replace' => ' محتوای موجود را جایگزین کنید',
 		),
-		'content_retrieval' => 'Content retrieval',	// TODO
+		'content_retrieval' => 'بازیابی محتوا',
 		'css_cookie' => ' هنگام واکشی محتوای مقاله از کوکی ها استفاده کنید',
 		'css_cookie_help' => ' مثال: <kbd>foo=bar; gdpr_consent=true; cookie=value</kbd>',
 		'css_help' => ' فیدهای RSS کوتاه شده را بازیابی می کند (احتیاط',
@@ -71,28 +71,28 @@ return array(
 		'empty' => ' این فید خالی است. لطفاً بررسی کنید که هنوز نگهداری می شود.',
 		'error' => ' این فید با مشکل مواجه شده است. لطفاً بررسی کنید که همیشه در دسترس است و سپس آن را به روز کنید.',	// DIRTY
 		'export-as-opml' => array(
-			'download' => 'Download',	// TODO
-			'help' => 'XML file (data subset. <a href="https://freshrss.github.io/FreshRSS/en/developers/OPML.html" target="_blank">See documentation</a>)',	// TODO
-			'label' => 'Export as OPML',	// TODO
+			'download' => 'دانلود',
+			'help' => 'فایل XML (زیرمجموعه داده‌ها. <a href="https://freshrss.github.io/FreshRSS/en/developers/OPML.html" target="_blank">مستندات را ببینید</a>)',
+			'label' => 'خروجی به صورت OPML',
 		),
-		'ext_favicon' => 'Set automatically',	// TODO
-		'favicon_changed_by_ext' => 'The icon has been set by the <b>%s</b> extension.',	// TODO
+		'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>.',
 		),
-		'http_headers' => 'HTTP Headers',	// TODO
-		'http_headers_help' => 'Headers are separated by a newline, and the name and value of a header are separated by a colon (e.g: <kbd><code>Accept: application/atom+xml<br />Authorization: Bearer some-token</code></kbd>).',	// TODO
-		'icon' => 'Icon',	// TODO
+		'http_headers' => 'HTTP سربرگ‌ها',
+		'http_headers_help' => 'سر برگ ها با یک خط جدید از هم جدا می‌شوند و نام و مقدار سربرگ ها با یک دونقطه از هم جدا می‌شوند (مثلاً: <kbd><code>پذیرش: application/atom+xml<br />مجوز: Bearer some-token</code></kbd>).',
+		'icon' => 'آیکون',
 		'information' => ' اطلاعات',
 		'keep_min' => ' حداقل تعداد مقالات برای نگهداری',
 		'kind' => array(
 			'_' => ' نوع منبع خوراک',
 			'html_json' => array(
-				'_' => 'HTML + XPath + JSON dot notation (JSON in HTML)',	// TODO
+				'_' => 'HTML + XPath + JSON dot notation (JSON in HTML)',	// IGNORE
 				'xpath' => array(
-					'_' => 'XPath for JSON in HTML',	// TODO
-					'help' => 'Example: <code>normalize-space(//script[@type="application/json"])</code> (single JSON)<br />or: <code>//script[@type="application/ld+json"]</code> (one JSON object per article)',	// TODO
+					'_' => '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(
@@ -143,44 +143,44 @@ return array(
 				'xpath' => ' XPath برای:',
 			),
 			'json_dotnotation' => array(
-				'_' => 'JSON (dot notation)',	// TODO
+				'_' => 'JSON (نماد نقطه‌ای)',
 				'feed_title' => array(
-					'_' => 'feed title',	// TODO
-					'help' => 'Example: <code>meta.title</code> or a static string: <code>"My custom feed"</code>',	// TODO
+					'_' => 'عنوان فید',
+					'help' => 'مثال: <code>meta.title</code> یا یک رشته استاتیک: <code>"My custom feed"</code>',
 				),
-				'help' => 'A JSON dot notated uses dots between objects and brackets for arrays (e.g. <code>data.items[0].title</code>)',	// TODO
+				'help' => 'یک نماد نقطه‌ای در JSON از نقطه بین اشیاء و از براکت برای آرایه‌ها استفاده می‌کند (مثلاً <code>data.items[0].title</code>)',
 				'item' => array(
-					'_' => 'finding news <strong>items</strong><br /><small>(most important)</small>',	// TODO
-					'help' => 'JSON path to the array containing the items, e.g. <code>$</code> or <code>newsItems</code>',	// TODO
+					'_' => 'یافتن اخبار <strong>آیتم‌ها</strong><br /><small>(مهم‌ترین)</small>',
+					'help' => 'مسیر JSON به آرایه حاوی آیتم‌ها، مثلاً <code>$</code> یا <code>newsItems</code>',
 				),
-				'item_author' => 'item author',	// TODO
-				'item_categories' => 'item tags',	// TODO
+				'item_author' => 'نویسنده ',
+				'item_categories' => 'برچسب‌های آیتم',
 				'item_content' => array(
-					'_' => 'item content',	// TODO
-					'help' => 'Key under which the content is found, e.g. <code>content</code>',	// TODO
+					'_' => 'محتوای در مورد',
+					'help' => 'کلیدی که محتوا در آن یافت می‌شود، مثلاً <code>content</code>',
 				),
 				'item_thumbnail' => array(
-					'_' => 'item thumbnail',	// TODO
-					'help' => 'Example: <code>image</code>',	// TODO
+					'_' => 'تصویر مینیاتوری',
+					'help' => 'مثال: <code>تصویر</code>',
 				),
 				'item_timeFormat' => array(
-					'_' => 'Custom date/time format',	// TODO
-					'help' => 'Optional. A format supported by <a href="https://php.net/datetime.createfromformat" target="_blank"><code>DateTime::createFromFormat()</code></a> such as <code>d-m-Y H:i:s</code>',	// TODO
+					'_' => 'قالب تاریخ/زمان سفارشی',
+					'help' => 'اختیاری. فرمتی که توسط <a href="https://php.net/datetime.createfromformat" target="_blank"><code>DateTime::createFromFormat()</code></a> پشتیبانی می‌شود، مانند <code>d-m-Y H:i:s</code>',
 				),
 				'item_timestamp' => array(
-					'_' => 'item date',	// TODO
-					'help' => 'The result will be parsed by <a href="https://php.net/strtotime" target="_blank"><code>strtotime()</code></a>',	// TODO
+					'_' => 'تاریخ کالا',
+					'help' => 'نتیجه توسط <a href="https://php.net/strtotime" target="_blank"><code>strtotime()</code></a> تجزیه و تحلیل خواهد شد.',
 				),
-				'item_title' => 'item title',	// TODO
-				'item_uid' => 'item unique ID',	// TODO
+				'item_title' => 'عنوان مورد',
+				'item_uid' => 'شناسه منحصر به فرد کالا',
 				'item_uri' => array(
-					'_' => 'item link (URL)',	// TODO
-					'help' => 'Example: <code>permalink</code>',	// TODO
+					'_' => 'لینک مورد (URL)',
+					'help' => 'مثال: <code>پیوند یکتا</code>',
 				),
-				'json' => 'dot notation for:',	// TODO
-				'relative' => 'dot notated path (relative to item) for:',	// TODO
+				'json' => 'نمادگذاری نقطه‌ای برای:',
+				'relative' => 'مسیر با نقطه (نسبت به آیتم) برای:',
 			),
-			'jsonfeed' => 'JSON Feed',	// TODO
+			'jsonfeed' => 'فید JSON',
 			'rss' => ' RSS / Atom (پیش‌فرض)',
 			'xml_xpath' => ' XML + XPath',
 		),
@@ -194,29 +194,29 @@ return array(
 		'max_http_redir' => ' حداکثر تغییر مسیر HTTP',
 		'max_http_redir_help' => ' روی 0 تنظیم کنید یا برای غیرفعال کردن آن را خالی بگذارید',
 		'method' => array(
-			'_' => 'HTTP Method',	// TODO
+			'_' => 'روش HTTP',
 		),
-		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
-		'method_postparams' => 'Payload for POST',	// TODO
+		'method_help' => 'بار داده‌ی POST به طور خودکار از <code>application/x-www-form-urlencoded</code> و <code>application/json</code> پشتیبانی می‌کند.',
+		'method_postparams' => 'بار مفید برای پست',
 		'moved_category_deleted' => ' هنگامی که یک دسته را حذف می کنید',
 		'mute' => array(
 			'_' => ' بی صدا',
-			'state_is_muted' => 'This feed is muted',	// TODO
+			'state_is_muted' => 'این فید بی‌صدا است',
 		),
 		'no_selected' => ' هیچ خوراکی انتخاب نشده است.',
 		'number_entries' => ' %d مقاله',
-		'open_feed' => 'Open feed %s',	// TODO
-		'path_entries_conditions' => 'Conditions for content retrieval',	// TODO
+		'open_feed' => 'باز کردن فید %s',
+		'path_entries_conditions' => 'شرایط بازیابی محتوا',
 		'priority' => array(
 			'_' => ' دید',
 			'archived' => ' نشان داده نشود (بایگانی شده)',
 			'category' => ' نمایش در دسته بندی خود',
-			'important' => 'Show in important feeds',	// TODO
+			'important' => 'نمایش در فیدهای مهم',
 			'main_stream' => ' نمایش در جریان اصلی',
 		),
 		'proxy' => ' یک پروکسی برای واکشی این فید تنظیم کنید',
-		'proxy_help' => ' یک پروتکل (به عنوان مثال: SOCKS5) انتخاب کنید و آدرس پراکسی را وارد کنید (به عنوان مثال: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',	// DIRTY
-		'reset_favicon' => 'Reset to default',	// TODO
+		'proxy_help' => ' یک پروتکل (به عنوان مثال: SOCKS5) انتخاب کنید و آدرس پراکسی را وارد کنید (به عنوان مثال: <kbd>127.0.0.1:1080</kbd> or <kbd>username:password@127.0.0.1:1080</kbd>)',
+		'reset_favicon' => 'تنظیم مجدد به حالت پیش‌فرض',
 		'selector_preview' => array(
 			'show_raw' => ' نمایش کد منبع',
 			'show_rendered' => 'نمایش محتوا',
@@ -236,16 +236,16 @@ return array(
 		'title_add' => ' یک فید RSS اضافه کنید',
 		'ttl' => ' به‌طور خودکار بیشتر از آن رفرش نکنید',
 		'unicityCriteria' => array(
-			'_' => 'Article unicity criteria',	// TODO
-			'forced' => '<span title="Block the unicity criteria, even when the feed has duplicate articles">forced</span>',	// TODO
-			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
-			'id' => 'Standard ID (default)',	// TODO
-			'link' => 'Link',	// TODO
+			'_' => 'معیارهای وحدت مقاله',
+			'forced' => '<span title="مسدود کردن معیارهای تک‌شاخگی، حتی زمانی که فید دارای مقالات تکراری است">اجباری</span>',
+			'help' => 'مربوط به فیدهای نامعتبر.<br />⚠️ تغییر سیاست باعث ایجاد موارد تکراری می‌شود..',
+			'id' => 'شناسه استاندارد (پیش‌ فرض)',
+			'link' => 'لینک',
 			'sha1:content' => 'Content',	// TODO
 			'sha1:content_published' => 'Content + Date',	// TODO
-			'sha1:link_published' => 'Link + Date',	// TODO
-			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
-			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:link_published' => 'لینک + تاریخ',
+			'sha1:link_published_title' => 'لینک + تاریخ + عنوان',
+			'sha1:link_published_title_content' => 'لینک + تاریخ + عنوان + محتوا',
 			'sha1:published' => 'Date',	// TODO
 			'sha1:title' => 'Title',	// TODO
 			'sha1:title_published' => 'Title + Date',	// TODO
@@ -261,7 +261,7 @@ return array(
 	'import_export' => array(
 		'export' => array(
 			'_' => ' صادرات',
-			'sqlite' => 'Download user database as SQLite',	// TODO
+			'sqlite' => 'دانلود پایگاه داده کاربر به عنوان SQLite',
 		),
 		'export_labelled' => ' مقالات برچسب دار خود را صادر کنید',
 		'export_opml' => ' لیست صادرات فیدها (OPML)',
@@ -286,7 +286,7 @@ return array(
 		'subscription_tools' => 'ابزارهای اشتراک',
 	),
 	'tag' => array(
-		'auto_label' => 'Add this label to new articles',	// TODO
+		'auto_label' => 'این برچسب را به مقالات جدید اضافه کنید',
 		'name' => ' نام',
 		'new_name' => ' نام جدید',
 		'old_name' => ' نام قدیمی',
@@ -298,7 +298,7 @@ return array(
 		'add_dynamic_opml' => ' OPML پویا را اضافه کنید',
 		'add_feed' => ' یک فید اضافه کنید',
 		'add_label' => ' یک برچسب اضافه کنید',
-		'add_opml_category' => 'OPML category name',	// TODO
+		'add_opml_category' => 'نام دسته OPML',
 		'delete_label' => ' یک برچسب را حذف کنید',
 		'feed_management' => ' فیدهای RSS را مدیریت می کندment',
 		'rename_label' => ' نام یک برچسب را تغییر دهید',

+ 2 - 2
docs/i18n/flags/gen/fa.svg

@@ -1,7 +1,7 @@
 <!-- This file is automatically generated by `cli/check.translation.php -g` -->
 <svg xmlns="http://www.w3.org/2000/svg" width="70" height="20">
 	<g fill="white" font-size="12" font-family="Verdana" text-anchor="middle">
-		<rect rx="3" width="70" height="20" fill="gold" />
-		<text x="34" y="14">🇮🇷 77%</text>
+		<rect rx="3" width="70" height="20" fill="green" />
+		<text x="34" y="14">🇮🇷 99%</text>
 	</g>
 </svg>